2011-07-30 58 views
3

誰能告訴我這是什麼做的代碼:我們如何獲得當前HttpRuntime的參考?

PropertyInfo p = typeof(HttpRuntime).GetProperty("FileChangesMonitor", 
        BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static); 

object o = p.GetValue(null, null); 

FieldInfo f = o.GetType().GetField("_dirMonSubdirs", 
       BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase); 

object monitor = f.GetValue(o); 

MethodInfo m = monitor.GetType().GetMethod("StopMonitoring", 
       BindingFlags.Instance | BindingFlags.NonPublic); 

m.Invoke(monitor, new object[] { }); 

怎麼的人得到這些反射場的名字呢?

感謝提前:)

回答

2

有效地,代碼的作用是等效的:

dynamic o = HttpRuntime.FileChangesMonitor; 
dynamic monitor = o._dirMonSubdirs; 
monitor.StopMonitoring(); 

的BindingFlags.NonPublic允許,通過使用反射的,訪問非公共字段。沒有反射,上面的代碼會產生一個編譯器錯誤。

反射字段名稱可以通過調試器獲得,或者類型可以通過反射枚舉。例如,爲了獲得一個X型的所有公立和非靜態字段,你可以使用:

 MemberInfo[] mi = typeof(X).GetType().FindMembers(MemberTypes.Property, 
      BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static, 
      (a, b) => true, // don't filter 
      null); 

注意,使用反射來訪問非公共成員通常被認爲是不良的做法,因爲這樣做依賴於實現機制是不保證,並且允許從版本到版本以及實現之間進行更改。