dynamic初探:
以前因為某些特殊原因,需要動態的呼叫外部類(假設這個類是實現了某個帶有引數的介面函式的),通常我們只能用反**。示例**如下:
assembly asm = assembly.loadfile(「***xx」)
asm.createinstance("myassembly.classname").gettype().invokemember("say", bindingflags.invokemethod, null, asm.createinstance("myassembly.classname "), new string );
這裡順便簡略說一下反射流程:首先通過絕對路徑載入某個net的dll檔案,然後建立該assembly中某個class的instance(該class必須有無參建構函式),獲取其型別之後動態呼叫其函式say,「bindingflags.invokemethod」表明是乙個普通類方法,「null」的地方是傳遞乙個引數名的,和指明最後的string中的一串values內容一一匹配的……可見使用反射呼叫函式是很痛苦的一件事情。
現在呢?您根本不需要那麼麻煩了!因為c#的dynamic會為您做好一切的,下面就是見證奇蹟的時刻——
assembly asm = assembly.loadfile("***xx");
dynamic dfun = asm.createinstance("myassembly.classname");
dfun.say("hello!");
注意到咖啡色的**了麼——什麼?dynamic竟然可以智慧型感知出動態載入的那個類的方法say?其實不然:當你按下這個點的時候,ide是沒有智慧型感知的,但是如果你知道這個類是有這個方法(因為介面給了其乙個契約,必須實現介面中的方法;而介面的方法是公開的),你就可以完全不理會智慧型感知,照樣寫,照樣編譯通過執行。神奇吧!
看到這裡,你就不會認為dynamic和var是「差不多」的概念了(var無非是根據賦值的型別編譯器自己判斷;且var不能作為函式返回值型別,但是dynamic可以)。
或許有人會疑問:dynamic可以完全替代類似像簡單工廠、抽象工廠一類的東西了咯?我的理解是——不對!從上面的定義中可以得知:dynamic必須首先獲取物件例項,然後動態反射是它做的事情;如果完全取代反射,例項也獲取不到,如何反射呢?真是「巧婦難為無公尺之炊」啊!
說道dynamic可以作為返回值,下面給出乙個例子:
class dynamicclass
public int num1
public int num2
public dynamicclass(int n1, int n2)
num1 = n1;
num2 = n2;
public dynamic dynamicaction
主函式注意咖啡色部分:
static void main(string args)
dynamicclass t = new dynamicclass(1, 2);
t.dynamicaction = new func((x, y) => x + y);
console.writeline(t.dynamicaction.invoke(t.num1,t.num2));
道理很簡單:因為dynamic型別可以賦值任何東西(包括匿名委託),所以我建立了乙個匿名委託給它。然後呼叫計算結果(匿名委託的呼叫使用invoke,可以省略)。
但是……dynamic不僅僅可以動態反射類方法和屬性,還可以「空中樓閣」般動態地去建立乙個類方法和屬性,並且賦值,相信嗎?這是第二話。
C 4 0和VS2010新特性(二)
6 協變和反變 co variant crop variant 這是vs2010新增的乙個內容,用於在編譯的時候確認是否允許不同型別的泛型介面之間是否存在轉換的問題。為了了解 協變 和 反變 的概念,我們先看乙個例子 假設我們定義了乙個介面和若干類 class father public virtu...
C 4 0和VS2010新特性(三)
vs2010之所以那麼強大,究其原因是其背後有著強大的c 4.0作為後台支撐。和以往的所有版本相比,c 4.0的動態性大大增強 dynamic就是乙個非常明顯的例子 一 dynamic初探 以前因為某些特殊原因,需要動態的呼叫外部類 假設這個類是實現了某個帶有引數的介面函式的 通常我們只能用反 示例...
vs2010與C 4 0新特性
vs2010被認為將是續寫visual studio 6 的扛鼎之作。整個ide不僅是使用了wpf重構,而且使用了最新的net framework 4作為強大的後援支撐。從上至下可圈可點。下面我們就來看一看vs2010在哪些方面引人注目 1 wpf重構介面 整個vs2010 ide全部使用wpf重構...