马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

C#中dynamic应用Clay【转】

[复制链接]
查看3764 | 回复2 | 2017-4-26 08:48:26 | 显示全部楼层 |阅读模式
一,多种方式初始化对象
1, 最简单的对象构建和初始化
[C#] 纯文本查看 复制代码
dynamic New = new ClayFactory();
var person = New.Person();
person.FirstName = "Louis";
person.LastName = "Dejardin";
注意这里的Person并不是一个具体的,实际存在的类或者结构体。我们在不需要定义Person类的情况下,就构建了一个具有FirstName和LastName属性的对象。

2, 使用索引器的方式初始化

[C#] 纯文本查看 复制代码
var person = New.Person();
person["FirstName"] = "Louis";
person["LastName"] = "Dejardin";

3, 使用匿名对象的方式实现初始化

[C#] 纯文本查看 复制代码
var person = New.Person(new {    FirstName = "Louis",    LastName = "Dejardin"});

4,使用命名参数方式实现初始化

[C#] 纯文本查看 复制代码
var person = New.Person(    FirstName: "Louis",    LastName: "Dejardin");

5,链式方式初始化

[C#] 纯文本查看 复制代码
var person = New.Person()   .FirstName("Louis")  .LastName("Dejardin")


读取属性方式
[C#] 纯文本查看 复制代码
person.FirstNameperson[“FirstName”]person.FirstName()


上面三种都是访问FirstName属性,它们都是等价的。
多种多样的初始化对象和读取属性的方式,让dynamic变得更加灵活. 这些都是ExpandoObject所做不到的。

二,构建神奇的Array
我们可以创建 JavaScript 风格的 Array:

[C#] 纯文本查看 复制代码
dynamic New = new ClayFactory();     
var people = New.Array(           
  New.Person().FirstName("Louis").LastName("Dejardin"), 
New.Person().FirstName("Bertrand").LastName("Le Roy")     
     )

1. 构建的Array, 具有Count属性

[C#] 纯文本查看 复制代码
Console.WriteLine("Count = {0}", people.Count);

2. 可以通过索引访问

[C#] 纯文本查看 复制代码
Console.WriteLine("people[0].FirstName = {0}", people[0].FirstName); 

3. 支持foreach遍历

[C#] 纯文本查看 复制代码
foreach (var person in people) 
{   
  Console.WriteLine("{0} {1}", person.FirstName, person.LastName);
}

4. 简单方便地为对象添加Array属性

[C#] 纯文本查看 复制代码
person.Aliases("bleroy", "BoudinFatal");

这里是为person这个动态对象添加了一个Array属性,属性的名字叫Aliases, 所以这里Aliases可以替换成任何名称,并没有特定含义。
下面的代码和上面的作用是等价的:
persons.Aliases1(new[] {"bleroy", "BoudinFatal"});
5. Array中的元素类型是dynamic,而不是普通类型

因为Array元素的类型是dynamic, 所以可以有这样的Array:
[C#] 纯文本查看 复制代码
var people = New.Array(     New.Person().FirstName("Louis").LastName("Dejardin"),     "Peter");

三, 为对象动态添加方法
和ExpandoObject一样,你也可以为其扩展方法,只是方法调用的时候,需要多添加一个().
这可能是Clay支持用()来访问对象属性导致的。
[C#] 纯文本查看 复制代码
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能办到!
[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;

五,Clay的应用背景
Clay产生于Orchard CMS项目,Orchard CMS是基于Asp.net MVC的开源CMS。对于CMS页面呈现所要使用的ViewModel来说,是无法预测和事先定义的,没有任何规则可言,因为你没有办法知道,我用到的页面会增加什么数据的显示。Orchard中想通过一种构建一个可以自由扩展的,灵活的dynamic对象来一劳永逸的解决这个问题,这就是Clay的初衷。
Clay是一个独立的开源项目,它无所不能的能力,一定能够帮助你简化很多类定义和反射代码。

六,Clay的Sample
Clay的示例代码可以通过nuget很方便的取到,给位可以自己建个Console程序,下载下来看看。

C#中dynamic应用Clay,www.ibcibc.com,c#教程

C#中dynamic应用Clay,www.ibcibc.com,c#教程





C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
ibcadmin | 2017-4-26 08:56:13 | 显示全部楼层
适合所有c#人
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
881966 | 2018-12-5 10:03:10 | 显示全部楼层
谢谢分享,学习学习
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则