與關鍵 字var的比較
從表面上看,dynamic與var關鍵字的用法很像,但實質上有 本質區別。
var關鍵字被稱為:隱含類型局部變量(Local Variable Type Inference),var只能用作局部變量,不能用於字段、參數等;聲明的同時必須 初始化;初始化時類型就已經明確了,並且不能再被賦值不能進行隱式類型轉換 的類型的數據;編譯時編譯器會對var定義的變量進行類型推斷,這時變量的類 型已經被確定。
dynamic可用於類型的字段,方法參數,方法返回值,可 用於泛型的類型參數等;可以賦值給或被賦值任何類型並且不需顯式的強制類型 轉換,因為這些是運行時執行的,這要得益於dynamic類型的動態特性。
與反射的比較
首先能看到的是,dynamic與反射相比,執行相同操作所需 的代碼少的多。
如調用類Me中的GetName()方法。
class Me
{
public string Blog { get; set; }
public string GetName()
{
return "Zhenxing Zhou";
}
}
用反射調用GetName()方法:
Assembly a = Assembly.GetExecutingAssembly();
object instance = a.CreateInstance ("Xianfen.Net.TestDynamic.Me");
Type type = instance.GetType();
MethodInfo mi = type.GetMethod("GetName");
object result = mi.Invoke(instance, null);
同樣的dynamic 調用:
dynamic myInfo = new Me();
string result = myInfo.GetName();
dynamic類型與反射相比能 進行的操作要少的多。
目前dynamic類型對屬性調用是不可用的,但我們 知道,屬性生成IL時,對屬性的讀或寫會生成對應的在屬性名前加上get_或set_ 前綴生成相應的方法,嘗試調用兩個方法來訪問屬性:
dynamic myInfo = new Me();
myInfo.set_Blog("http://www.xianfen.Net/");
string result = myInfo.get_Blog();
會拋出異常,提示找不到 get/set_Blog方法。這點比較遺憾,同樣,對有參屬性的訪問也是不行的。
反射還可以訪問私有方法字段以及其它類型成員及取得類型及類型成員 的信息等