.Net 4 中引入了 dynamic 动态类型,这一消息确实让我们兴奋了一把,但是兴奋之余,又发现它相对于其他的动态语言来说还有不足之处。不过借助 CodePlex 上的一个开源项目 Clay,我们可以写出以下不可思议的代码,代码如下:

成都创新互联凭借在网站建设、网站推广领域领先的技术能力和多年的行业经验,为客户提供超值的营销型网站建设服务,我们始终认为:好的营销型网站就是好的业务员。我们已成功为企业单位、个人等客户提供了网站制作、网站建设服务,以良好的商业信誉,完善的服务及深厚的技术力量处于同行领先地位。
- var directory = New.Array(
 - New.Person(
 - FirstName: "Louis",
 - LastName: "Dejardin",
 - Aliases: new[] { "Lou" }
 - ),
 - New.Person(
 - FirstName: "Bertrand",
 - LastName: "Le Roy"
 - ).Aliases("bleroy", "boudin"),
 - New.Person(
 - FirstName: "Renaud",
 - LastName: "Paquay"
 - ).Aliases("Your Scruminess", "Chef")
 - ).Name("Some Orchard folks");
 
让我们先来看看是代码是如何的不可思议。
不可思议的对象初始化
新建 c# 项目,引用 Clay 项目(或其 dll), 并加入下面一行代码(建议看完本文再自行尝试):
- dynamic New = new ClayFactory();
 
先看下面的简单代码:
- var person = New.Person();
 - person.FirstName = "Louis"
 - ;person.LastName = "Dejardin";
 
不足为奇,使用 .Net 4 中的 ExpandoObject 也能做到。
下面的代码就有点意思了:
- var person = New.Person();
 - person["FirstName"] = "Louis";
 - person["LastName"] = "Dejardin";
 
这段代码和上面的效果是一样的,它使用索引器的方式为 person 的属性赋值,是不是有点类似 JavaScript?
再来看 jQuery 风格的代码:
- var person = New.Person()
 - .FirstName("Louis")
 - .LastName("Dejardin");
 
还可以使用匿名类型方式:
- var person = New.Person(new {
 - FirstName = "Louis",
 - LastName = "Dejardin"
 - });
 
甚至还可以使用命名参数方式:
- var person = New.Person(
 - FirstName: "Louis",
 - LastName: "Dejardin"
 - );
 
不可思议吧!
综上所述,我们有多种方式始化实体设置属性值,以下方式都是等同的:
- person.FirstName
 - person["FirstName"]
 - person.FirstName()
 
不可思议的 Array
我们可以创建 JavaScript 风格的 Array:
- var people = New.Array(
 - New.Person().FirstName("Louis").LastName("Dejardin"),
 - New.Person().FirstName("Bertrand").LastName("Le Roy")
 - );
 
可如下操作这个集合:
- int count = people.Count;
 - string firstName = people[0].FirstName;
 
我们还可以给实例动态增加 array 属性:
- person.Aliases("bleroy", "BoudinFatal");
 
或者:
- person.Aliases(new[] {"Lou"});
 
还能向集合中增加新的元素:
- person.Aliases.Add("loudej");
 
到这里,写出文首给出的 c# 代码应该不成问题了。
不可思议的动态接口实现
“动态接口实现”这个标题可能不太恰当,还是通过代码来说明问题吧。假定我们有如下接口:
- public interface IPerson {
 - string FirstName { get; set; }
 - string LastName { get; set; }
 - }
 
可以如下使用:
- dynamic New = new ClayFactory();
 - var people = New.Array(
 - New.Person().FirstName("Louis").LastName("Dejardin"),
 - New.Person().FirstName("Bertrand").LastName("Le Roy")
 - );
 - IPerson lou = people[0];
 - var fullName = lou.FirstName + " " + lou.LastName;
 
只不过是我们通过 New.Person() 创建的一个动态对象,并没有实现 IPerson 接口啊,可就是能编译并运行通过:
神奇吧!还不抓紧试试!
Clay是 CodePlex 上的一个开源项目,帮助我们创建轻松创建对象,就 JavaScript 或其它动态语言一样简单。Clay 项目的网址是 http://clay.codeplex.com,目前没有发布好的下载,我们可以直接下载它的源码
【编辑推荐】
                文章标题:教你写不可思议的C#代码
                
                当前URL:http://www.csdahua.cn/qtweb/news3/82853.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网