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

    Reference from : http://www.cnblogs.com/JustRun1983/p/3529157.html

  • 相关阅读:
    设计模式之迭代模式
    CentOS8 上安装Docker
    设计模式之模板方法模式
    APP内嵌网页使用微信或支付宝的H5支付
    一、Mongodb安装和配置
    一台电脑上配置多个git的ssh key
    ELK搭建(docker环境)
    Elasticsearch7学习笔记
    java通过url获取音视频文件时长
    c语言之链表实现
  • 原文地址:https://www.cnblogs.com/zhangchenliang/p/5613316.html
Copyright © 2011-2022 走看看