首頁  >  文章  >  後端開發  >  C# 進階程式設計 第十二章 動態語言擴展

C# 進階程式設計 第十二章 動態語言擴展

大家讲道理
大家讲道理原創
2017-04-11 14:05:592272瀏覽

(一)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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn