文字列としてTKeyを使用し、コンパイル時に不明な型からのTValueを使用して辞書を作成したいと思います。
たとえば、私が関数を持っているとしましょう
createDict(Type type)
{
Dictionary<string, {here's the type from the func. argument}> dict = new Dictionary..
}
このシナリオは可能ですか、それとも非常に基本的なものが欠けていますか?
文字列としてTKeyを使用し、コンパイル時に不明な型からのTValueを使用して辞書を作成したいと思います。
たとえば、私が関数を持っているとしましょう
createDict(Type type)
{
Dictionary<string, {here's the type from the func. argument}> dict = new Dictionary..
}
このシナリオは可能ですか、それとも非常に基本的なものが欠けていますか?
typeをパラメーターとして渡すと、次のように実行できます。
var dictionaryType = typeof(Dictionary<,>).MakeGenericType(typeof(string),type);
var dictionary = (IDictionary)Activator.CreateInstance(dictionaryType);
この辞書に挿入されたものの正確さについてはあなたが全責任を負うため、そのような辞書の使用はより困難になります。
メソッドをジェネリックにします。
public void CreateDict<T>()
{
Dictionary<string,T> dict = new Dictionary<string,T>();
}
ただし、戻り型も必要にDictionary<string,T>
なり、ジェネリック型パラメーターに制約を追加することもできます。
あなたはそれを次のように呼ぶでしょう:
CreateDict<MyCustomType>();
上記は、コンパイル時に型を渡すことができることを前提としています。
あなたは少し反省することで行うことができます:
Type dict = typeof (Dictionary<,>);
Type[] parameters = {typeof (string), type};
Type parametrizedDict = dict.MakeGenericType(parameters);
object result = Activator.CreateInstance(parametrizedDict);
すべてのインスタンスとクラスはオブジェクトであるためDictionary<string,object>
、MVC、Session、またはCacheでViewDataを使用する場合と同じようにキャストする必要があります。これらはすべて、キャストが必要です。
コンパイル時に型がわかっている場合は、ジェネリックを使用します。
void Main()
{
var dict = CreateDict<int>();
dict["key"] = 10;
}
Dictionary<string, T> CreateDict<T>()
{
return new Dictionary<string, T>();
}
そうでない場合は、基本タイプまたはインターフェースを使用するようにリファクタリングします。例:
var dic = new Dictionary<string, IMyType>();
ここで、IMyTypeは、ディクショナリに保持したいタイプの一般的な特性を公開します。
最後の手段としてのみ、私は反省に目を向けます。