2012-01-18 4 views
3

クラス内のプロパティの型に基づいてC#generic辞書を動的に作成するにはどうすればよいですか?私は動的に以下のクラスのプロパティのタイプに基づいて、一般的な辞書を作成しようとしています

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

はのは、プロパティは変数「のプロパティタイプ」にしていることを割り当てられている統計のSystem.Typeをを想定してみましょうその型が汎用辞書である場合、IsGenericDictionaryメソッドはtrueを返します。私はすでに作成されたオブジェクトが、私はそのタイプのジェネリック辞書にキャストしたい一般的な辞書であることを知っているので

// Note: property is a System.Reflection.PropertyInfo 
Type propertyType = property.PropertyType; 
if (IsGenericDictionary(propertyType)) 
{ 
    object dictionary = Activator.CreateInstance(propertyType); 
} 

:私は、動的に同じタイプの一般的な辞書のインスタンスを作成するためにActivator.CreateInstanceを使用します引数はプロパティタイプの汎用引数と同じです:

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より前のpre-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

私はget:generic型 'System.Collections.Generic.IDictionary 'は2つの型引数を必要とします – tdc

+1

@tdcコードファイルの先頭に 'using System.Collections;'指示文を追加します –

関連する問題