C#進階編程 第十二章 動態語言擴充

來源:互聯網
上載者:User
(一)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;    }}

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.