zoukankan      html  css  js  c++  java
  • 理解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

     
  • 相关阅读:
    泛微云桥e-Bridge 目录遍历,任意文件读取
    (CVE-2020-8209)XenMobile-控制台存在任意文件读取漏洞
    selenium 使用初
    将HTML文件转换为MD文件
    Python对word文档进行操作
    使用java安装jar包出错,提示不是有效的JDK java主目录
    Windows server 2012安装VM tools异常解决办法
    ifconfig 命令,改变主机名,改DNS hosts、关闭selinux firewalld netfilter 、防火墙iptables规则
    iostat iotop 查看硬盘的读写、 free 查看内存的命令 、netstat 命令查看网络、tcpdump 命令
    使用w uptime vmstat top sar nload 等命令查看系统负载
  • 原文地址:https://www.cnblogs.com/webenh/p/7691665.html
Copyright © 2011-2022 走看看