首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

用 Clay 庫打造動態物件:寫出 JavaScript 風格的 C# 程式碼

     編輯:關於C語言

前言

.NET 4 引入 dynamic 與 ExpandoObject,讓 C# 具備動態語言特性。但開源專案 Clay (CodePlex) 更進一步,提供極具表達力的流暢介面,讓物件初始化、陣列建構、動態介面實作如同 JavaScript 般直觀。本文將帶你體驗這些「不可思議」的寫法。

快速上手

// NuGet: Install-Package Clay
dynamic New = new ClayFactory();

多樣化的物件初始化

以下寫法完全等價,皆產生擁有 FirstName、LastName 屬性的動態物件:

// 1. 屬性指派
var p1 = New.Person();
p1.FirstName = "Louis";
p1.LastName = "Dejardin";

// 2. 索引器指派
var p2 = New.Person();
p2["FirstName"] = "Louis";
p2["LastName"] = "Dejardin";

// 3. jQuery 風格鏈式呼叫
var p3 = New.Person().FirstName("Louis").LastName("Dejardin");

// 4. 匿名型別
var p4 = New.Person(new { FirstName = "Louis", LastName = "Dejardin" });

// 5. 命名參數
var p5 = New.Person(FirstName: "Louis", LastName: "Dejardin");

核心機制:Person、FirstName、LastName 皆為動態成員,Clay 透過 DynamicObject 攔截呼叫並建構屬性包。

JavaScript 風格的陣列操作

// 建構陣列
var people = New.Array(
    New.Person().FirstName("Louis").LastName("Dejardin"),
    New.Person().FirstName("Bertrand").LastName("Le Roy")
);

// 存取
int count = people.Count;           // 2
string name = people[0].FirstName;  // "Louis"

// 動態新增陣列屬性
people[0].Aliases("Lou", "Loulou");           // 參數陣列
people[0].Aliases(new[] { "Lou" });           // 陣列
people[0].Aliases.Add("loudej");              // List 風格

動態介面實作:鴨子型別的極致

public interface IPerson
{
    string FirstName { get; set; }
    string LastName { get; set; }
}

// Clay 物件自動滿足介面契約
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];           // 隱含轉型成功!
string fullName = lou.FirstName + " " + lou.LastName; // "Louis Dejardin"

Clay 內部產生實作 IPerson 的動態 Proxy,無需類別宣告即可滿足靜態型別檢查。

適用場景與取捨

  • ✅ 測試資料快速建構、原型開發、動態腳本宿主、DSL 內部實作。
  • ❌ 高效能熱路徑、嚴格型別領域模型、長期維護的核心業務邏輯。

專案網址:https://clay.codeplex.com(現已歸檔,可參考 GitHub Fork 版本)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved