c#Clay开源的动态语言dynamic框架,让您形如javascript的方式创建对象!
简介
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的方式创建对象!相关推荐
- 美团:某动态线程池框架是官方开源的么?
大家好,我是马称. 最近,有很多同学在微信上问我这么一个问题: Hippo4j 动态线程池框架是美团开源的么? 类似于这样的问题还挺多,在这里统一回复下: 美团官方并没有开源任何关于动态线程池的框架. ...
- python动态语言双刃性_动态语言的灵活性是把双刃剑:以 Python 语言为例
原标题:动态语言的灵活性是把双刃剑:以 Python 语言为例 本文有些零碎,总题来说,包括两个问题:(1)可变对象(最常见的是list dict)被意外修改的问题,(2)对参数(parameter) ...
- 框架 go_Colly - 优雅极速的Go语言爬虫框架
写爬虫,Python 是目前的第一选择,但总觉得 Python 太慢了,而且缺乏静态类型.能不能换 Go 语言来试试呢?Colly,这个既优雅又快速的 Go 语言爬虫框架,是你的不二选择. 爬虫框架 ...
- python语言的理解-Python动态语言理解
1. 动态语言的定义 动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用.它是一类 在运行时可以改变其结构的语言 :例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删 ...
- python特性编译语言_Python的动态语言特性; __slots__属性
python是动态语言 1. 动态语言的定义 动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用.它是一类 在运行时可以改变其结构的语言 :例如新的函数.对象.甚至代码可以被 ...
- python语言的作者是_Python是一门动态语言
[IT168 评论]动态语言的定义 动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用.它是一类 在运行时可以改变其结构的语言 :例如新的函数.对象.甚至代码可以被引进,已有 ...
- python 为什么动态语言图片_聊聊动态语言那些事(Python)
动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用.它是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化.动态语言 ...
- python是动态_1.2. Python是动态语言
python是动态语言 1. 动态语言的定义 动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用.它是一类 在运行时可以改变其结构的语言 :例如新的函数.对象.甚至代码可以被 ...
- python是动态语言
1. 动态语言的定义 动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用.它是一类 在运行时可以改变其结构的语言 :例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删 ...
最新文章
- KR C、ANSI C、C89、C90、C95、C99 和 C11 的区别联系
- opencv 裁剪 java_OpenCV绘制轮廓和裁剪
- JSBinding+SharpKit / 更新的原理
- deepin安装mysql失败_deepin20无法安装mysql
- 自考计算机应用技术实践考核,自考计算机应用基础课程实践考核内容
- .NET 是什么意思
- 2. Linear Model
- 什么叫无纸化会议系统?有哪些实用功能
- java digester_使用digester解析XML配置文件
- 健康体检信息系统源码、医院体检源码 医院管理系统源码
- 视频剪辑入门技能快速分享
- 物来顺应,未来不迎,当时不杂,既过不恋
- 估值篇之最关键指标ROE
- 狐妖小红娘手游服务器维护多久,狐妖小红娘手游:《狐妖小红娘》手游停服公告...
- java远控_基于java的远程控制 示例源码
- HDU 1248(寒冰王座)
- 【翻译】 XDP的力量
- 习题 8-20 懒惰的苏珊(Lazy Susan, ACM/ICPC Danang 2007, UVa1620)
- C语言实现『推箱子』
- google 浏览器打印不出颜色问题