(一)DLR
C#4的動態功能是Dynamic Language Runtime(動態語言運行時,DLR)的一部分。DLR是添加到CLR的一系列服務。
(二)dynamic類型
dynamic類型允許編寫忽略編譯期間的類型檢查的代碼。編譯器假定,給dynamic類型的對象定義的任何操作都是有效的,在運行之前編譯器不會檢測是否存在錯誤。
例子:
dynamic person = "人"; string firstName = person.FirstName;
這兩行代碼能夠通過編譯器編譯,但是點擊運行後會報錯:
需要注意的是,dynamic類型雖然很有用,但是它是有代價的。
(三)包含DLR ScriptRuntime
給應用程序添加腳本編輯功能,並給腳本傳入數值和從腳本傳出數值,是應用程序可以利用腳本完成工作。
(四)DynamicObject和ExpandoObject
從DynamicObject中派生或者使用ExpandoObject可以創建自己的動態對象。
使用DynamicObject派生創建動態對象,需要重寫3個方法TrySetMembe()、TryGetMember()和TryInvokeMember()。
使用ExpandoObject與DynamicObject進行派生的區別在於不用重寫方法。
例子:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Func<string, string, string> getFullName = (f, l) => { return f + " " + l; }; 6 dynamic byexobj = new ExpandoObject(); 7 byexobj.FirstName = "李"; 8 byexobj.LastName = "四"; 9 byexobj.GetFullName = getFullName; 10 Console.WriteLine(byexobj.GetType()); 11 Console.WriteLine(byexobj.GetFullName(byexobj.FirstName, byexobj.LastName)); 12 Console.WriteLine("====================="); 13 dynamic dyobj = new MyDynamicObject(); 14 dyobj.FirstName = "張"; 15 dyobj.LastName = "三"; 16 dyobj.GetFullName = getFullName; 17 Console.WriteLine(dyobj.GetType()); 18 Console.WriteLine(dyobj.GetFullName(dyobj.FirstName, dyobj.LastName)); 19 Console.ReadKey(); 20 } 21 } 22 23 public class MyDynamicObject : DynamicObject 24 { 25 Dictionary<string, object> dynamicData = new Dictionary<string, object>(); 26 public override bool TrySetMember(SetMemberBinder binder, object value) 27 { 28 dynamicData[binder.Name] = value; 29 return true; 30 } 31 public override bool TryGetMember(GetMemberBinder binder, out object result) 32 { 33 bool success = false; 34 result = null; 35 if (dynamicData.ContainsKey(binder.Name)) 36 { 37 result = dynamicData[binder.Name]; 38 success = true; 39 } 40 else 41 { 42 result = "未找到該屬性的值"; 43 success = false; 44 } 45 return success; 46 } 47 public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) 48 { 49 dynamic method = dynamicData[binder.Name]; 50 result = method((string)args[0],(string)args[1]); 51 return result != null; 52 } 53 }
運行以上代碼,結果如下: