(一)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進行派生的差異在於不用重寫方法。
範例:
class Program { static void Main(string[] args) { Func<string, string, string> getFullName = (f, l) => { return f + " " + l; }; dynamic byexobj = new ExpandoObject(); byexobj.FirstName = "李"; byexobj.LastName = "四"; byexobj.GetFullName = getFullName; Console.WriteLine(byexobj.GetType()); Console.WriteLine(byexobj.GetFullName(byexobj.FirstName, byexobj.LastName)); Console.WriteLine("====================="); dynamic dyobj = new MyDynamicObject(); dyobj.FirstName = "张"; dyobj.LastName = "三"; dyobj.GetFullName = getFullName; Console.WriteLine(dyobj.GetType()); Console.WriteLine(dyobj.GetFullName(dyobj.FirstName, dyobj.LastName)); Console.ReadKey(); } } public class MyDynamicObject : DynamicObject { Dictionary<string, object> dynamicData = new Dictionary<string, object>(); public override bool TrySetMember(SetMemberBinder binder, object value) { dynamicData[binder.Name] = value; return true; } public override bool TryGetMember(GetMemberBinder binder, out object result) { bool success = false; result = null; if (dynamicData.ContainsKey(binder.Name)) { result = dynamicData[binder.Name]; success = true; } else { result = "未找到该属性的值"; success = false; } return success; } public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { dynamic method = dynamicData[binder.Name]; result = method((string)args[0],(string)args[1]); return result != null; } }
執行上述程式碼,結果如下:
#
##以上是C# 進階程式設計 第十二章 動態語言擴展的詳細內容。更多資訊請關注PHP中文網其他相關文章!