2009-06-28 1 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); 

하지만 다음 인덱스 속성 메서드를 호출하는 클래스의 인스턴스에 설정하는 방법을 알아낼 수 I 이상 가시성이 없습니다.

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

어떤 배경에서 메신저 어디 이러한 모든 인 System.DirectoryServices.AccountManagement.Principal을 확장하려고 도움이된다면 :

extensionCache는 다음과 같은 유형이다 방법은 살아 간다.

참조 방법 : ExtensionSet에 당신의 도움에 대한

감사합니다.

답변

3

첫 번째 꺼짐; 이 레벨로의 반사는 일반적으로 코드 냄새입니다. 돌봐 ...

한 번에 한 걸음; 첫째, 우리가 얻을 필요가 ExtensionCache :

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

그런 다음 우리가 필요로하는 properties :

dict[attribute] = ... 

:

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

지금 새 값으로, dict에 인덱서를 사용할 수 있습니다 다음 문제는 ExtensionCacheValue을 만드는 방법입니다. 이 유형에 액세스 할 수 없다고 가정합니다. (내부 용) ...

Type type = extCache.GetType().Assembly.GetType(
     "Some.Namespace.ExtensionCacheValue"); 
object[] args = {value}; // needed to double-wrap the array 
object newVal = Activator.CreateInstance(type, args); 
... 
dict[attribute] = newVal; 

그 중 어떤 것도 도움이됩니까?