プロフィール:プロフィール
ClayはExpandoObjectに非常に似ており、ExpandoObjectの拡張版と見ることができる。クラスを定義することなく、必要なオブジェクトを構築することができます。ClayはExpandoObjectよりも柔軟な構文サポートを提供しており、C#コードをJava Scriptコードと同じように記述でき、複雑なオブジェクトを複数レベルで構築することもできます。

複数の方法でオブジェクトを初期化
最も単純なオブジェクトの構築と初期化
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"
});
名前付きパラメータを使用した初期化
var person = New.Person(
FirstName: "Louis",
LastName: "Dejardin"
);
5.チェーンの初期化
var person = New.Person()
.FirstName("Louis")
.LastName("Dejardin");
プロパティの読み取り方法
person.FirstName
person[“FirstName”]
person.FirstName()
上記の3つはすべてFirstNameプロパティへのアクセスであり、等価です。
多种多样的初始化对象和读取属性的方式,让dynamic变得更加灵活. 这些都是ExpandoObject所做不到的。
魔法の配列を作る
Java Scriptスタイルの配列を作成できます。
dynamic New = new ClayFactory();
var people = New.Array(
New.Person().FirstName("Louis").LastName("Dejardin"),
New.Person().FirstName("Bertrand").LastName("Le Roy")
);
- 構築されたArray、Countプロパティを使用した構築されたArray
Console.WriteLine("Count = {0}", people.Count);
- 索引でアクセス可能
Console.WriteLine("people[0].FirstName = {0}", people[0].FirstName);
- Foreachトラバースのサポート
foreach (var person in people) {
Console.WriteLine("{0} {1}", person.FirstName, person.LastName);
}
- オブジェクトにArrayプロパティを簡単かつ簡単に追加
person.Aliases("bleroy", "BoudinFatal");
这里是为person这个动态对象添加了一个Array属性,属性的名字叫Aliases, 所以这里Aliases可以替换成任何名称,并没有特定含义。
以下のコードは上記のコードと等価です。
persons.Aliases1(new[] {"bleroy", "BoudinFatal"});
- 配列の要素型は通常の型ではなく動的です。
因为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!"));
動的な実装インタフェース
このインターフェイスを定義し、動的型付けでオブジェクトを作成し、このオブジェクトがインターフェイスを実装していると仮定すると、これは不可能に見えます。クレイならできる!
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は独立したオープンソースプロジェクトであり、その全能性は多くのクラス定義やリフレクションコードを簡素化するのに役立ちます。