程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 【讀書筆記】C#高級編程 第十二章 動態語言擴展,

【讀書筆記】C#高級編程 第十二章 動態語言擴展,

編輯:C#入門知識

【讀書筆記】C#高級編程 第十二章 動態語言擴展,


(一)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 }    

運行以上代碼,結果如下:

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved