c# clay開源的動態語言dynamic框架,讓您形如javascript的方式創建對象!

c# clay開源的動態語言dynamic框架,讓您形如javascript的方式創建對象!

能夠讓我們在不需要定義類的情況下,就構建出我們想要的對象。

最后更新 2022/7/15 下午9:33
黑哥聊dotNet
预计阅读 4 分钟
分类
.NET
标签
.NET C# 開源

簡介

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);
  1. 可以通過索引訪問
Console.WriteLine("people[0].FirstName = {0}", people[0].FirstName);
  1. 支持 foreach 遍歷
foreach (var person in people) {
     Console.WriteLine("{0} {1}", person.FirstName, person.LastName);
}
  1. 簡單方便地為對象添加 array 屬性
person.Aliases("bleroy", "BoudinFatal");

这里是为person这个动态对象添加了一个Array属性,属性的名字叫Aliases, 所以这里Aliases可以替换成任何名称,并没有特定含义。

下面的代碼和上面的作用是等價的:

persons.Aliases1(new[] {"bleroy", "BoudinFatal"});
  1. 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 是一個獨立的開源項目,它無所不能的能力,一定能夠幫助你簡化很多類定義和反射代碼。

Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2026/2/7

aot使用經驗總結

從項目創建伊始,就應養成良好的習慣,即只要添加了新功能或使用了較新的語法,就及時進行 aot 發布測試。

继续阅读