(一)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 }
運行以上代碼,結果如下:
