理解C# 4 dynamic(4) – 让人惊艳的Clay

简介:

Clay非常类似于ExpandoObject, 可以看做是ExpandoObject的加强版. 它们能够让我们在不需要定义类的情况下,就构建出我们想要的对象。Clay和ExpandoObject相比,提供了更加灵活的语法支持,让我们像写javascript代码一样写C#代码,同时还能够用于构建多层级的复杂对象。

阅读目录:

一、多种方式初始化对象

二、构建神奇的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所做不到的。

二,构建神奇的Array

我们可以创建 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的应用背景

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

Clay是一个独立的开源项目,它无所不能的能力,一定能够帮助你简化很多类定义和反射代码。

六,Clay的Sample

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博客园博客,原文链接:http://www.cnblogs.com/JustRun1983/p/3529157.html,如需转载请自行联系原作者


目录
相关文章
|
3月前
|
JavaScript 前端开发
Google Earth Engine(GEE)扩展——ee-polyfill JavaScript 方法 (ES6+)
Google Earth Engine(GEE)扩展——ee-polyfill JavaScript 方法 (ES6+)
16 1
|
11天前
|
缓存 移动开发 前端开发
【专栏:HTML与CSS前端技术趋势篇】HTML与CSS在PWA(Progressive Web Apps)中的应用
【4月更文挑战第30天】PWA(Progressive Web Apps)结合现代Web技术,提供接近原生应用的体验。HTML在PWA中构建页面结构和内容,响应式设计、语义化标签、Manifest文件和离线页面的创建都离不开HTML。CSS则用于定制主题样式、实现动画效果、响应式布局和管理字体图标。两者协同工作,保证PWA在不同设备和网络环境下的快速、可靠和一致性体验。随着前端技术进步,HTML与CSS在PWA中的应用将更广泛。
|
5月前
|
移动开发 前端开发
移动开发—媒体查询(Media Query)
移动开发—媒体查询(Media Query)
|
Web App开发 前端开发 算法
2022 年最受瞩目的新特性 CSS @layer 到底是个啥?
2022 年最受瞩目的新特性 CSS @layer 到底是个啥?
189 0
2022 年最受瞩目的新特性 CSS @layer 到底是个啥?
|
传感器 编解码 算法
Google Earth Engine ——MOD17A3H.006: Terra Net Primary Production Yearly Global 500m这是该产品的NASA版本年度净初级
Google Earth Engine ——MOD17A3H.006: Terra Net Primary Production Yearly Global 500m这是该产品的NASA版本年度净初级
299 0
Google Earth Engine ——MOD17A3H.006: Terra Net Primary Production Yearly Global 500m这是该产品的NASA版本年度净初级
|
机器学习/深度学习 Web App开发 传感器
GEE(Google Earth Engine)——JavaScript 入门(1)
GEE(Google Earth Engine)——JavaScript 入门(1)
445 0
GEE(Google Earth Engine)——JavaScript 入门(1)
|
JavaScript 前端开发
GEE(Google Earth Engine)——JavaScript 入门(3)
GEE(Google Earth Engine)——JavaScript 入门(3)
159 0
|
JavaScript 前端开发
Google Earth Engine(GEE)——JavaScript基本功能介绍(对图像的操作)
Google Earth Engine(GEE)——JavaScript基本功能介绍(对图像的操作)
128 0
|
Web App开发 移动开发 JavaScript
8个前沿的 HTML5 &amp; CSS3 效果【附源码下载】
作为一个前沿的 Web 开发者,对于 HTML5 和 CSS3 技术或多或少都有掌握。前几年这些新技术刚萌芽的时候,开发者们已经使用它们来小试牛刀了,如今这些先进技术已经遍地开发,特别是在移动端大显身手。
1467 0