2009-06-28 7 views
1

私はリフレクションを使用してこのコード行を設定する方法を思い付くしようとしているいくつかの助けを必要とする:複素反射シナリオ

this.extensionCache.properties[attribute] 
          = new ExtensionCacheValue((object[]) value); 

this.extensionCacheが継承する基底クラスイムで内部のプライベートフィールドです。

私は次のコードでextensionCacheフィールドで取得できます。

FieldInfo field = typeof(Principal).GetField("extensionCache",BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); 

しかし、私は、私のクラスのインスタンスに設定されたインデックスとプロパティメソッドを呼び出す方法を見つけ出すことはできません見通しがない

extensionCacheは、次のタイプである:いくつかその背景はどここれらすべてであるSystem.DirectoryServices.AccountManagement.Principalを拡張しようとしているイムを助けた場合はここで

internal class ExtensionCache 
{ 
    private Dictionary<string, ExtensionCacheValue> cache 
        = new Dictionary<string, ExtensionCacheValue>(); 

    internal ExtensionCache() 
    { 
    } 

    internal bool TryGetValue(string attr, out ExtensionCacheValue o) 
    { 
     return this.cache.TryGetValue(attr, out o); 
    } 

    // Properties 
    internal Dictionary<string, ExtensionCacheValue> properties 
    { 
     get 
     { 
      return this.cache; 
     } 
    } 
} 

は値クラスは

internal ExtensionCacheValue(object[] value) 
{ 
    this.value = value; 
    this.filterOnly = false; 
} 

です方法は生きる。

参照方法:ExtensionSet

ありがとうございました。

答えて

3

最初にオフ、このレベルへの反映は、通常、コードの匂いです。気をつけてください...

一度に1ステップずつ実行してください。まず、我々はExtensionCacheを取得する必要があります:

FieldInfo field = typeof(Principal).GetField("extensionCache", 
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); 
object extCache = field.GetValue(obj); 

その後、我々はpropertiesが必要になります。

field = extCache.GetType().GetField("properties", 
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); 
IDictionary dict = (IDictionary) field.GetValue(extCache); 

あなたは今、新しい値で、dictにインデクサを使用することができます。

dict[attribute] = ... 

次の問題は、ExtensionCacheValueを作成する方法です。私はあなたがこのタイプ(内部として)にアクセスできないと仮定します...

いずれかの助けがありますか?