Typeを含む変数を使用してGeneric <T>型インスタンスを作成する


85

次のコードを実現することは可能ですか?動作しないことはわかっていますが、回避策があるかどうか疑問に思っていますか?

Type k = typeof(double);
List<k> lst = new List<k>();

「これはC#4.0で実現できます」というコメントに少し混乱しています。少なくともあなたがそれを示す方法では、それはできません。C#4でも、コンパイル時にジェネリック型パラメーターを指定する必要があります。Type変数をジェネリック型パラメーターとして渡すことはできません。
itowlson 2010年

1
質問の場合は質問として表現してください。指定されたコードは、C#4.0では実行できません。
Lasse V. Karlsen 2010年


C#4.0のことでごめんなさい。つまり、答えはC#4.0の概念を使用できるということであり、必ずしもコードがC#4.0で機能するとは限りません。DrJokepuを編集していただきありがとうございます。
クリス

12
この質問は完璧に述べられていると思います-ちょうどいい量の詳細です!
runHolt 2013年

回答:


119

はいあります:

var genericListType = typeof(List<>);
var specificListType = genericListType.MakeGenericType(typeof(double));
var list = Activator.CreateInstance(specificListType);

これが私が欲しいものだと思います。再確認させていただきます。すぐに回答としてマークします。
クリス

3
ここでの主な問題は、あなたが私たちに何を望んでいるのかを説明していないことだと思います。あなたは私たちに何かの試みが失敗したことを示し、次にあなたが望むことを達成する方法を尋ねます。推測ではなく答えが必要な場合は、どのように試みたかではなく、何をする必要があるかを説明する必要があります。
Lasse V. Karlsen 2010年

基本的に、型がType変数として指定されているList <>を作成したいと思います。
クリス

3
David Mに感謝します、あなたのコードは私が必要としていたことを正確に実行します。十分な質問をしなかったために答えられなかった方には申し訳ありません。
クリス

ジェネリックメソッドに対して同じ方法を実行することは可能ですか?私はリンクの下に私の問題を掲載している、メソッドの動的な型を渡す必要がありstackoverflow.com/questions/4101784/...
Mathiyazhagan

3

よりクリーンな方法は、一般的な方法を使用することかもしれません。このようなことをします:

static void AddType<T>()
    where T : DataObject
{
    Indexes.Add(typeof(T), new Dictionary<int, T>());
}

「インデックス」の意味がわかりませんが、変数は他の場所で宣言されていますか?
JRH
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.