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】