简介

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

多种方式初始化对象

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应用背景

想通过一种构建一个可以自由扩展的,灵活的dynamic对象来一劳永逸的解决问题,这就是Clay的初衷。

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

c#Clay开源的动态语言dynamic框架,让您形如javascript的方式创建对象!相关推荐

  1. 美团:某动态线程池框架是官方开源的么?

    大家好,我是马称. 最近,有很多同学在微信上问我这么一个问题: Hippo4j 动态线程池框架是美团开源的么? 类似于这样的问题还挺多,在这里统一回复下: 美团官方并没有开源任何关于动态线程池的框架. ...

  2. python动态语言双刃性_动态语言的灵活性是把双刃剑:以 Python 语言为例

    原标题:动态语言的灵活性是把双刃剑:以 Python 语言为例 本文有些零碎,总题来说,包括两个问题:(1)可变对象(最常见的是list dict)被意外修改的问题,(2)对参数(parameter) ...

  3. 框架 go_Colly - 优雅极速的Go语言爬虫框架

    写爬虫,Python 是目前的第一选择,但总觉得 Python 太慢了,而且缺乏静态类型.能不能换 Go 语言来试试呢?Colly,这个既优雅又快速的 Go 语言爬虫框架,是你的不二选择. 爬虫框架 ...

  4. python语言的理解-Python动态语言理解

    1. 动态语言的定义 动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用.它是一类 在运行时可以改变其结构的语言 :例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删 ...

  5. python特性编译语言_Python的动态语言特性; __slots__属性

    python是动态语言 1. 动态语言的定义 动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用.它是一类 在运行时可以改变其结构的语言 :例如新的函数.对象.甚至代码可以被 ...

  6. python语言的作者是_Python是一门动态语言

    [IT168 评论]动态语言的定义 动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用.它是一类 在运行时可以改变其结构的语言 :例如新的函数.对象.甚至代码可以被引进,已有 ...

  7. python 为什么动态语言图片_聊聊动态语言那些事(Python)

    动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用.它是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化.动态语言 ...

  8. python是动态_1.2. Python是动态语言

    python是动态语言 1. 动态语言的定义 动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用.它是一类 在运行时可以改变其结构的语言 :例如新的函数.对象.甚至代码可以被 ...

  9. python是动态语言

    1. 动态语言的定义 动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用.它是一类 在运行时可以改变其结构的语言 :例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删 ...

最新文章

  1. KR C、ANSI C、C89、C90、C95、C99 和 C11 的区别联系
  2. opencv 裁剪 java_OpenCV绘制轮廓和裁剪
  3. JSBinding+SharpKit / 更新的原理
  4. deepin安装mysql失败_deepin20无法安装mysql
  5. 自考计算机应用技术实践考核,自考计算机应用基础课程实践考核内容
  6. .NET 是什么意思
  7. 2. Linear Model
  8. 什么叫无纸化会议系统?有哪些实用功能
  9. java digester_使用digester解析XML配置文件
  10. 健康体检信息系统源码、医院体检源码 医院管理系统源码
  11. 视频剪辑入门技能快速分享
  12. 物来顺应,未来不迎,当时不杂,既过不恋
  13. 估值篇之最关键指标ROE
  14. 狐妖小红娘手游服务器维护多久,狐妖小红娘手游:《狐妖小红娘》手游停服公告...
  15. java远控_基于java的远程控制 示例源码
  16. HDU 1248(寒冰王座)
  17. 【翻译】 XDP的力量
  18. 习题 8-20 懒惰的苏珊(Lazy Susan, ACM/ICPC Danang 2007, UVa1620)
  19. C语言实现『推箱子』
  20. google 浏览器打印不出颜色问题

热门文章

  1. 《游戏大师Chris Crawford谈互动叙事》一22.1 互动叙事前途无量
  2. webpack开发Vue配置
  3. 如何在Lua与C/C++之间实现table数据的交换
  4. HDS业务定义永续IT架构
  5. append()与extend()
  6. 分析android动画模块[转]
  7. matlab 规范,matlab-代码-规范
  8. 版本控制介绍以及常用的版本控制工具
  9. 20165310_获奖感想与Java阶段性学习总结
  10. Android 4.X 系统加载 so 失败的原因分析