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

一,多种方式初始化对象

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的使用

原文地址:http://www.cnblogs.com/JustRun1983/p/3529157.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java实现多文件上传至本地服务器

转载自 java实现多文件上传至本地服务器 博主最近在做一个内网项目&#xff0c;内部可以访问外部数据&#xff0c;但是外部访问不了内部数据&#xff0c;这也就造成了可能文件无法上传&#xff0c;所以博主另辟蹊径&#xff0c;在本地服务器上建立一个文件夹专门用来存储上传…

配置struts.xml时extends=struts-default会报错,原因和解决

提示&#xff1a;此种解决方法只适用于Intellij IDEA&#xff0c;MyEclipse或者Eclipse还得另寻它法&#xff0c;但估计原因应该是类似的。 在Intellij IDEA 2017使用Struts2框架时&#xff0c;若新建项目时并未导入Struts2框架而是在后期手动新建lib目录导入Struts2框架后&…

React生命周期(新)

三个标红的需要前面加上UNSAFE_ 三个常用的组件

《坚毅》的读后感

1.你的梦想是什么&#xff1f;有了梦想&#xff0c;那么接下来呢&#xff1f; 2.有什么问题&#xff1f; 3.你每天醒来后想阿着的是什么&#xff1f; 4.为什么现在是正确的时机&#xff1f; 5.你曾经做过的最艰难的事情是什么&#xff1f; 6.谁希望你成功&#xff1f; 7.你最重…

发力企业级市场,微软Hololens开辟了一条VR新道路

近日微软Hololens可谓是动作频频&#xff0c;2月份Hololens与BGC Engineering合作&#xff0c;从矿山规划到泥石流建模&#xff0c;该应用程序可帮助BGC Engineering及其客户可视化一个场景并解决工程问题。 3月份HoloLens与Cigna展开医疗合作&#xff0c;将Hololens用于健康检…

写给工程师的10条精进原则

转载自 写给工程师的10条精进原则 引言 时间回到8年前&#xff0c;我人生中的第一份实习工作&#xff0c;是在某互联网公司的无线搜索部做一个C工程师。当时的我可谓意气风发&#xff0c;想要大干一场&#xff0c;结果第一次上线就写了人生中第一个CaseStudy。由于对部署环境…

Struts2下创建自定义类型转换器(表单中日期的处理)

在表单提交中需要有日期的输入&#xff0c;默认的Struts2处理机制可能不能满足需求&#xff0c;需要自定义一下类型转换器。如&#xff1a; String----->java.util.Date&#xff1a;输入 java.util.Date------>String:输出&#xff1a;查询显示&#xff0c;输出错误回显 …

部署:持续集成(CI)与持续交付(CD)——《微服务设计》读书笔记

一.CI&#xff08;Continuous Integration&#xff09;简介 CI规则1&#xff1a;尽量频繁地把代码签入到分支中以进行集成 CI规则2&#xff1a;不光要对语法进行验&#xff0c;也要提供一系列的自动化来验证 CI规则3&#xff1a;CI失败后&#xff0c;要把修复CI当做第一优先级的…

使用ListView控件展示数据

一、使用ListView实现大图标小图标的功能&#xff1a; 1.拖一个ListView控件 2.拖两个imageList控件&#xff0c;并且重命名为imgBig和imgSmall,分别设置两个控件的图片和大小。 3.编辑ListView的Items&#xff0c;添加几项&#xff08;C、D、E盘&#xff09; 4.通过ListView绑…

React中的唯一标识key(用index VS id)和key的选择

1. 虚拟DOM中key的作用&#xff1a;1). 简单的说: key是虚拟DOM对象的标识, 在更新显示时key起着极其重要的作用。2). 详细的说: 当状态中的数据发生变化时&#xff0c;react会根据【新数据】生成【新的虚拟DOM】, 随后React进行【新虚拟DOM】与【旧虚拟DOM】的diff比较&#x…

Android中ImageView的scaleType 属性说明。

ImageView是Android中最常用的控件之一&#xff0c;在使用ImageView的时候&#xff0c;必不可少的会使用到scaleType属性&#xff0c;该属性指定了你的ImageView如何显示图片。包括是否进行缩放&#xff0c;等比缩放&#xff0c;缩放后显示的位置&#xff0c; Android中提供了八…

支付渠道参数如何设计成路由化配置

转载自 支付渠道参数如何设计成路由化配置 今天我们来探讨在搭建支付系统时一个比较关键的问题&#xff1a;渠道参数路由化配置如何设计&#xff1f; 在开发支付系统的时候&#xff0c;我们经常会涉及到对接多个支付渠道&#xff0c;除常见的支付宝、微信外可能还会根据不同的…

实现Windows程序的数据更新

一、枚举&#xff1a; 1.语法&#xff1a;public enum 名字{ 值1,值2} 2.eg:public enum Genders{Male,FeMale} 3.使用枚举&#xff1a;枚举名.值 4.枚举的好处&#xff1a; (1)使代码更易于维护 (2)更易于用户输入值&#xff0c;直接用.的方式就可以获取值 (3)使代码更清晰&a…

分布式数据访问服务之1—华山论剑篇

业界主流的互联网架构中&#xff0c;分布式服务框架、分布式数据访问服务、消息队列服务、服务网关(API)、分布式事务等都是核心的组件和框架。 当我们的系统规模越来越大&#xff0c;从几台服务器扩展到几十台、几百台、上千台&#xff0c;传统的烟囱式的、大集中式系统架构&…

Android中异步任务AsyncTask的使用

1、当程序启动的时候&#xff0c;Android同时会启动一个对应的线程&#xff0c;【主线程、UI线程】主要负责处理与UI相关的线程 2、UI线程不允许访问网络进行耗时操作 3、子线程不允许更新UI。 由于Android中主线程不能访问网络、子线程不能更新UI&#xff0c;需要线程间通讯 完…

漫画:什么是快速排序?(完整版)

转载自 漫画&#xff1a;什么是快速排序&#xff1f;&#xff08;完整版&#xff09; 同冒泡排序一样&#xff0c;快速排序也属于交换排序&#xff0c;通过元素之间的比较和交换位置来达到排序的目的。 不同的是&#xff0c;冒泡排序在每一轮只把一个元素冒泡到数列的一端&a…

测试——《微服务设计》读书笔记

一.测试象限&#xff08;Brain Marick&#xff09; 二.测试金字塔&#xff08;Mike Cohn&#xff09; 1.单元测试 通常只测试一个函数或方法调用&#xff0c;通过TDD或者基于属性而写的测试就属于这一类&#xff0c;在UnitTest中&#xff0c;我们不会启动服务&#xff0c;对且对…

React功能界面的组件化编码流程

功能界面的组件化编码流程&#xff08;通用&#xff09; 1.拆分组件: 拆分界面,抽取组件 2.实现静态组件: 使用组件实现静态页面效果 3.实现动态组件 3.1 动态显示初始化数据 3.1.1 数据类型 3.1.2 数据名称 3.1.2 保存在哪个组件? 3.2 交互(从绑定事件监听开始)