2011-07-30 20 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[] { }); 

がどのように人はこれらの反射のフィールド名を取得するのですか?

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

BindingFlags.NonPublicは非公開フィールドにアクセスする、リフレクションを使用して、許可する:事前に

おかげで:)

答えて

2

は事実上、コードは同等のものをやっています。リフレクションがなければ、上記のコードはコンパイラエラーを生成します。

リフレクションフィールド名は、デバッガを使用して取得することも、リフレクションによってタイプを列挙することもできます。そうすることがある実装力学に依存しているので、非公開メンバーにアクセスするためにリフレクションを使用しては、一般的に、貧しい練習考えられている

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

注こと:例えば、タイプXのすべての公開と非公開静的フィールドを取得するには、あなたが使用することができます保証されておらず、バージョン間および実装間で変更することができます。

関連する問題