Dynamic 動態類型 和雙問號??的使用

1.dynamic關鍵字用於聲明一個動態對象,然後通過該動態對象去調用方法或讀寫屬性。以前我們都是在運行時通過反射,Emit,CodeDom等技術來完成。創建一個dynamic類型的對象需要使用一個特殊的構建器叫ExpandoObject。

            dynamic aehyok = new ExpandoObject();
            aehyok.Name = "aehyok";
            aehyok.Age = "24";
            aehyok.Position = "ASP.NET";
            Console.WriteLine("姓名:" + aehyok.Name + "年齡:" + aehyok.Age + aehyok.Position);
            Console.ReadKey();

通過控制檯執行程序可以查看執行結果爲:

 

2.通過動態類型來實現基於duck typing的泛型參數約束。

複製代碼
    public static class Calculator { 
        public static T Add<T>(T t1, T t2)
        { 
            dynamic d1 = t1; 
            dynamic d2 = t2; 
            return (T)(d1 + d2); 
        }
    }
複製代碼

那麼通過調用

            int i = Calculator.Add(1, 2);
            double d = Calculator.Add(1.1, 2.2);
            string s = Calculator.Add("abc", "def");
            Console.WriteLine(i + " " + d + " " + s);
            Console.ReadKey();

執行後發現

 

除了運算符重載,對於普通的方法調用也是適用的。這種方法是一種動態duck typing的泛型參數約束機制,依賴於運行時的方法查找,與模板編譯時的檢查不同,它需要使用者保證傳入的對象符合相應要求。

 

3.DynamicObject類都通過虛方法virtual去“實現”了接口中所有的方法,只要繼承了這個類,讀者可以根據需要“任意”動態覆蓋你要的方法)。

複製代碼
    public class DynamicAnimal : DynamicObject
    {
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            bool success = base.TryInvokeMember(binder, args, out result);
            //如果方法不存在,請將result 這個out參數賦值爲null            
            if (!success)
            {
                result = null;
            }
            //如果這個地方返回false 將會引發異常            
            return true;
        }
    }
複製代碼

繼承此類被進行簡單的實現。

接下來我們創建了兩個類。

複製代碼
    public class Duck : DynamicAnimal
    {
        public string Quack()
        {
            return "鴨子嘛,就是Quack吧。";
        }
    }

    public class Human : DynamicAnimal
    {
        public string Talk()
        {
            return "人類是用Talk,而不是Quack";
        }
    }
複製代碼

通過控制檯應用程序進行調用

複製代碼
        static void Main(string[] args)
        {
            var duck = new Duck();
            var cow = new Human();
            Console.WriteLine("鴨子是Quack");
            Console.WriteLine(DoQuack(duck));
            Console.WriteLine("人類是talk");
            Console.WriteLine(DoQuack(cow));
            Console.ReadKey();

        }

        public static string DoQuack(dynamic animal)
        {
            string result = animal.Quack();
            return result ?? "...人類當然不會鴨叫...";
        }
    }
複製代碼

當然我們在下面定義了一個靜態的方法傳入dynamic類型,這裏需要去調試就會明白。其中還有一個雙問號

4.雙問號的作用:

雙問號(??)是一個單元運算符,那麼其左右兩邊數據類型必須是相同類型或能隱形轉換類型的。它表示的意思是,首先檢測左邊的值,若其爲Null,那麼整個表達式取值爲右側的值,否則爲左側的值。

 

參考以下鏈接:C#4.0和VS2010新特性(三)

 

示例代碼



此文章源自於【http://www.cnblogs.com/aehyok/archive/2012/11/23/2784659.html】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章