string JSon = @"{ ""FirstName"": ""John"", ""LastName"": ""Smith"", ""Age"": 21 }";
dynamic person = CreateFromJson(JSon);
Console.WriteLine("{0} will be {1} next year", person.FirstName, person.Age + 1);
Console.WriteLine(person.ToJSon());
person.Play("basketball"); // 編譯通過,運行時拋出異常
dynamic 讓編譯器跳過型別檢查,將屬性/方法存取轉為反射調用。運行時類型若有對應成員即可運作。
完全基於運行時協議,無任何靜態檢查,類似 HTTP+XML。理想方式應為:不檢查物件型別,但檢查屬性型別與方法簽名,如下虛擬語法:
Console.WriteLine("{0} will be {1} next year", person.FirstName<string>, person.Age<int> + 1);
Console.WriteLine(person.ToJSon<string>());
person.Play<string>("basketball");
如此僅名稱動態,型別與簽名靜態,降低運行時錯誤並享受靜態檢查優勢。
object jsonObj = CreateFromJSon(...);
Dynamic person = new Dynamic(JSonObject);
string firstName = person.Property<string>("FirstName");
int age = person.Property<int>("Age");
Func<string> toJson = person.Method<Func<string>>("ToJSon");
Action<string> play = person.Method<Action<string>>("Play");
有興趣可自行實作 Dynamic 類別。
下一篇繼續探討 C# 模擬實現動態型別。