[譯]反射(Reflection)和動態(dynamic)


反射
 
當我們需要檢查,調用一個程序集的內容的時候,用反射,比如,當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 

再來一張圖...
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM