Type içeren bir değişkenle Generic <T> tipi bir örnek oluşturma


85

Aşağıdaki kodu elde etmek mümkün mü? İşe yaramadığını biliyorum, ama bir çözüm olup olmadığını merak ediyorum.

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

Yorumunuz biraz karıştı "bu, C # 4.0 ile başarılabilir." Yapamaz, en azından gösterdiğiniz şekilde değil. C # 4 hala genel tür parametrelerinin derleme sırasında belirtilmesini gerektirir; Tür değişkenini genel bir tür parametresi olarak hala iletemezsiniz.
itowlson

1
Lütfen soru sorulduğunda bir şeyler ifade edin. Belirtilen kod, C # 4.0 ile gerçekleştirilemez.
Lasse V.Karlsen


C # 4.0 olayı için üzgünüm. Cevabın C # 4.0'daki kavramları kullanabileceğini, kodun C # 4.0'da çalışacağını kastetmiştim. DrJokepu düzenlemesi için teşekkürler.
Chris

12
Bence bu soru mükemmel bir şekilde ifade edildi - sadece doğru miktarda ayrıntı!
RunHolt

Yanıtlar:


119

Evet var:

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

Sanırım istediğim bu. Tekrar kontrol edeyim, ben de sizin yanıtınızı bir an için işaretleyeceğim.
Chris

3
Sanırım buradaki asıl sorun, bize ne istediğinizi anlatmamanız . Sana en başarısız bir girişimi göstermektedir şey ve sonra ne başarmak nasıl sorar istediğiniz . Tahmin değil cevaplar istiyorsan, bunu nasıl yapmaya çalıştığın yerine ne yapman gerektiğini açıklamalısın.
Lasse V.Karlsen

Temel olarak, türün bir Tür değişkeni olarak belirtildiği bir Liste <> oluşturmak istiyorum.
Chris

3
Teşekkürler David M, kodunuz tam olarak ihtiyacım olan şeyi yapıyor. Yeterli bir soru sormadığım için cevap veremeyenlere özür dilerim.
Chris

Genel Yöntemler için aynı yolu yapmak mümkün müdür? yöntem için dinamik türü
geçmem

3

Daha temiz bir yol, genel bir yöntem kullanmak olabilir. Bunun gibi bir şey yapın:

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

"Dizinler" ile ne demek istediğinizden emin değilim, bu başka bir yerde açıklanan bir değişken mi?
JRH
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.