发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
Clay非常类似于ExpandoObject, 可以看做是ExpandoObject的加强版. 它们能够让我们在不需要定义类的情况下,就构建出我们想要的对象。Clay和ExpandoObject相比,提供了更加灵活的语法支持,让我们像写javascript代码一样写C#代码,同时还能够用于构建多层级的复杂对象。
阅读目录: 一、多种方式初始化对象 二、构建神奇的Array 三、为对象动态添加方法 四、动态的实现接口 五、Clay的应用背景 六、Clay的Sample
阅读目录:
一、多种方式初始化对象
二、构建神奇的Array
三、为对象动态添加方法
四、动态的实现接口
五、Clay的应用背景
六、Clay的Sample
1, 最简单的对象构建和初始化
dynamic New = new ClayFactory(); var person = New.Person(); person.FirstName = "Louis"; person.LastName = "Dejardin";
注意这里的Person并不是一个具体的,实际存在的类或者结构体。我们在不需要定义Person类的情况下,就构建了一个具有FirstName和LastName属性的对象。
2, 使用索引器的方式初始化
var person = New.Person(); person["FirstName"] = "Louis"; person["LastName"] = "Dejardin";
3, 使用匿名对象的方式实现初始化
var person = New.Person(new { FirstName = "Louis", LastName = "Dejardin" });
4,使用命名参数方式实现初始化
var person = New.Person( FirstName: "Louis", LastName: "Dejardin" );
5,链式方式初始化
var person = New.Person() .FirstName("Louis") .LastName("Dejardin");
读取属性方式
person.FirstName person[“FirstName”] person.FirstName()
上面三种都是访问FirstName属性,它们都是等价的。多种多样的初始化对象和读取属性的方式,让dynamic变得更加灵活. 这些都是ExpandoObject所做不到的。
我们可以创建 JavaScript 风格的 Array:
dynamic New = new ClayFactory(); var people = New.Array( New.Person().FirstName("Louis").LastName("Dejardin"), New.Person().FirstName("Bertrand").LastName("Le Roy") );
1. 构建的Array, 具有Count属性
Console.WriteLine("Count = {0}", people.Count);
2. 可以通过索引访问
Console.WriteLine("people[0].FirstName = {0}", people[0].FirstName);
3. 支持foreach遍历
foreach (var person in people) { Console.WriteLine("{0} {1}", person.FirstName, person.LastName); }
4. 简单方便地为对象添加Array属性
person.Aliases("bleroy", "BoudinFatal");
这里是为person这个动态对象添加了一个Array属性,属性的名字叫Aliases, 所以这里Aliases可以替换成任何名称,并没有特定含义。下面的代码和上面的作用是等价的:
persons.Aliases1(new[] {"bleroy", "BoudinFatal"});
5. Array中的元素类型是dynamic,而不是普通类型
因为Array元素的类型是dynamic, 所以可以有这样的Array:
var people = New.Array( New.Person().FirstName("Louis").LastName("Dejardin"), "Peter" );
和ExpandoObject一样,你也可以为其扩展方法,只是方法调用的时候,需要多添加一个().这可能是Clay支持用()来访问对象属性导致的。
var person = New.Pserson(); person.FirstName = "Louis"; person.LastName = "Dejardin"; person.SayFullName = new Func<string, string>(x => person.FirstName + person.LastName + x); Console.WriteLine(person.SayFullName()(" Here!"));
假设我们定义了这个接口,用动态类型创建一个对象,而且这个对象是实现了该接口,这看起来是不是不可完成的任务? Clay能办到!
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;
Clay产生于Orchard CMS项目,Orchard CMS是基于Asp.net MVC的开源CMS。对于CMS页面呈现所要使用的ViewModel来说,是无法预测和事先定义的,没有任何规则可言,因为你没有办法知道,我用到的页面会增加什么数据的显示。Orchard中想通过一种构建一个可以自由扩展的,灵活的dynamic对象来一劳永逸的解决这个问题,这就是Clay的初衷。
Clay是一个独立的开源项目,它无所不能的能力,一定能够帮助你简化很多类定义和反射代码。
Clay的示例代码可以通过nuget很方便的取到,给位可以自己建个Console程序,下载下来看看。
相关系列文章:
理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用
理解C# 4 dynamic(2) – ExpandoObject的使用
理解C# 4 dynamic(3) – DynamicObject的使用
理解C# 4 dynamic(4) – 让人惊艳的Clay
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】按钮。如果,您希望更容易地发现我的新博客,不妨点击一下右下角的【关注 Justrun】。因为,我的写作热情也离不开您的肯定支持。
感谢您的阅读,这里还有你可能感兴趣的文章推荐博客文章。
本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名justrun(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
来自: 昵称10504424 > 《工作》
0条评论
发表
请遵守用户 评论公约
C#程序编写高质量代码改善的157个建议【13-15】[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]
C#程序编写高质量代码改善的157个建议【13-15】[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]前言。public class Person { public string IDCode { get;///开始改变Niki的值 Nik...
JPA的Embeddable Objects - LalfaShi‘Blog
还没完!Person类中的name属性需要与数据库表中的first,last两个字段进行映射,如下:@Embedded@AttributeOverrides( {@AttributeOverride(name = firstName, column = @Column(name = first_name)),@Attr...
PropertyGrid Refresh problem...
PropertyGrid Refresh problem...I am attaching one object to this propertygrid say ''Employee''. And one property of ''Name'' i am changing at run time in ...
脚本百事通
4、Option: 如果你在使用MagicalRecord方法的时候不想带MR_ 前缀,e.g. 直接用findAll 代替 MR_findAll,就在PCH中在CoreData+MagicalRecord.h之前增加 #defin MR_SHORTHAND 即可。NSArray *persons =...
Windows8SQLite数据库操作[Sync]
C# IEnumerable和IEnumerator的区别,如何实现
IEnumerable接口和IEnumerator接口是.NET中非常重要的接口,二者有何区别?public interface IEnumerable { IEnumerator GetEnumerator();3.一个collection要支持Foreach进行遍...
javascript对象
开源项目Xstream简介
开源项目Xstream简介 ---用于序列化对象与XML对象之间的相互转换。//不使用XPP3库XStream xstream = new XStream(new DomDriver());<person> <firstName>Bill</firstName> <lastN...
IbatisNet开发使用小结 之一
是否使用Satement命名空间,这里的命名空间指的是映射文件中sqlMap节点的namespace属性,如上例中针对Person表的映射文件sqlMap节点。ID...
微信扫码,在手机上查看选中内容