反射
當我們需要檢查,調用一個程序集的內容的時候,用反射,比如,當VS給智能提示的時候,就應用了反射。
簡單用法實例:
var myAssembly = Assembly.LoadFile(@"C:\ClassLibrary1.dll"); var myType = myAssembly.GetType("ClassLibrary1.Class1"); dynamic objMyClass = Activator.CreateInstance(myType); // 獲取類的類型信息 Type parameterType = objMyClass.GetType(); // 瀏覽方法 foreach (MemberInfo objMemberInfo in parameterType.GetMembers()) {Console.WriteLine(objMemberInfo.Name);} // 瀏覽屬性. foreach (PropertyInfo objPropertyInfo in parameterType.GetProperties()) {Console.WriteLine(objPropertyInfo.Name);} //開始調用 parameterType.InvokeMember("Display",BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Instance,null, objMyClass, null);
實際一點的用處呢:
1.當你也要開發一個類似VS的編輯器的時候,要提供智能提示就需要反射
2.當創建單元測試框架的時候,為了測試需要動態調用方法和屬性的時候
3.有時候我們想把類型的屬性,方法等全部導出的時候
動態dynamic
編程語言分為強/弱類型,dynamic是弱類型,此關鍵字會讓編譯器不做編譯時的類型檢查,只做運行時的檢查。
dynamic x = "c#"; x++;
所以上面這行代碼可以編譯通過,但會產生運行時一場。
實際用處:
最多的就是通過互操作來操作Office組件的時候了
沒有dynamic的時候
/ Before the introduction of dynamic. Application excelApplication = new Application(); ((Excel.Range)excelApp.Cells[1, 1]).Value2 = "Name"; Excel.Range range2008 = (Excel.Range)excelApp.Cells[1, 1];
有了dynamic之后世界就不一樣了
dynamic excelApp = new Application(); excelApp.Cells[1, 1].Value = "Name"; Excel.Range range2010 = excelApp.Cells[1, 1];
兩者的區別和聯系呢
1.當我們想要在運行時操作一個對象的時候,就會用到這兩個
2.反射可以用來檢測對象的元數據,也能在運行時調用對象的方法和屬性
3.dynamic是.net 4.0新出的關鍵字,知道方法被調用的時候,編譯器才會曉得這個方法到底有還是沒有。
4.dynamic內部是使用反射來實現的,它緩存了方法調用來提高性能
5.反射可以調用公有和私有成員,而dynamic智能調用用公有成員
6.dynamic是實例相關的,無法訪問靜態成員,這種情況下使用反射吧。
Reflection | Dynamic | |
Inspect (meta-data) | Yes | No |
Invoke public members | Yes | Yes |
Invoke private members | Yes | No |
Caching | No | Yes |
Static class | Yes | No |
再來一張圖...
