2012-01-18 1 views
3

나는 동적으로 다음 클래스의 속성의 유형에 따라 일반 사전을 만들려고 오전 :클래스의 속성 유형을 기반으로 C# generic 사전을 동적으로 만드는 방법은 무엇입니까?

public class StatsModel 
{ 
    public Dictionary<string, int> Stats { get; set; } 
} 

하는의이 속성은 변수 'propertyType'에와 있다는 할당 된 통계의 System.Type을 가정 해 봅시다 형식이 일반 사전 인 경우 IsGenericDictionary 메서드는 True를 반환합니다. 나는 동적으로 동일한 유형의 일반적인 사전 인스턴스를 생성 Activator.CreateInstance로를 사용

이미 생성 된 객체가 나는 유형이 일반 사전에 캐스팅하고 싶은 일반 사전이 있음을 알고 있기 때문에
// Note: property is a System.Reflection.PropertyInfo 
Type propertyType = property.PropertyType; 
if (IsGenericDictionary(propertyType)) 
{ 
    object dictionary = Activator.CreateInstance(propertyType); 
} 

인수는 속성 유형의 일반적인 인수와 동일합니다.

Type[] genericArguments = propertyType.GetGenericArguments(); 
// genericArguments contains two Types: System.String and System.Int32 
Dictionary<?, ?> = (Dictionary<?, ?>)Activator.CreateInstance(propertyType); 

가능합니까?

답변

5

원한다면 리플렉션 또는 dynamic을 사용하여 제네릭 방식으로 뒤집고 제네릭 유형 인수를 사용해야합니다. 그것 없이는 object을 사용해야합니다. 당신이 사전 (: object를 사용하고 있지만)에 기대는 데이터에 액세스 할 수 있습니다

// we know it is a dictionary of some kind 
var data = (IDictionary)Activator.CreateInstance(propertyType); 

, 모든 일반적인 방법 : 개인적으로, 난 그냥 여기에 제네릭이 아닌 IDictionary API를 사용하십시오. 일반적인 방법으로 바꾸는 것은 고통입니다. 4.0 이전 버전에서는 리플렉션이 필요합니다. 구체적으로는 MakeGenericMethodInvoke입니다. 당신은, 그러나, dynamic를 사용하여 4.0에서 부정 행위를 할 수와

dynamic dictionary = Activator.CreateInstance(propertyType); 
HackyHacky(dictionary); 

: 일반적인 사전 방법에

void HackyHacky<TKey,TValue>(Dictionary<TKey, TValue> data) { 
    TKey ... 
    TValue ... 
} 
+0

액세스 내가 찾던 것입니다. 나는 해킹을 좋아하지 않기 때문에 특히 IDictionary로 캐스팅 할 것이다 ;-) 대단히 감사합니다. Marc! – Jeroen

+0

다음과 같이 표시됩니다. generic 형식 'System.Collections.Generic.IDictionary '에 2 개의 형식 인수가 필요합니다. – tdc

+1

@tdc 코드 파일 맨 위에'using System.Collections;'지시문을 추가하십시오. –

관련 문제