2009-06-28 16 views
1

Ich brauche Hilfe mit einem Weg zu kommen versuchen, diese Codezeile setzen Reflexion mit:Complex Reflection Szenario

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

this.extensionCache ist ein internes privates Feld in dem im Basisklasse erbt aus.

Ich kann mit dem folgenden Code am extensionCache Feld erhalten:

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

Aber ich kann nicht herausfinden, wie die Eigenschaften Methode mit einem Index nennen setzen sie dann auf eine Instanz einer Klasse, die ich habe keine Sichtbarkeit.

extensionCache ist der folgenden Art:

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; 
     } 
    } 
} 

Hier ist der Wert der Klasse

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

Wenn einige backgroud hilft im System.DirectoryServices.AccountManagement.Principal zu erweitern versuchen, die, wo alle diese ist Methoden leben.

Siehe Methode: ExtensionSet

Vielen Dank für Ihre Hilfe.

Antwort

3

Zunächst einmal; Reflexion auf diesem Niveau ist normalerweise ein Code-Geruch; mach's gut ...

Nimm es einen Schritt nach dem anderen; Zunächst müssen wir die bekommen ExtensionCache:

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

Dann brauchen wir die properties:

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

Sie jetzt den Indexer auf dict, mit dem neuen Wert verwenden können:

dict[attribute] = ... 

Das nächste Problem ist, wie man ein ExtensionCacheValue erstellt; Ich nehme an, Sie haben keinen Zugang zu diesem Typ (wie intern) ...

Irgendwelche dieser Hilfe?