2012-01-20 21 views
10

T türünün yansıma yoluyla bildiğim birbiriyle ilgisiz birkaç sınıf (aynı yapıcı argümanlarıyla) olduğu bir Liste oluşturmak istiyorum.Liste Oluşturma <> runtime türünden

DataBase = new ArrayList(); 
    foreach (Type T in Types) 
    { 
     DataBase.Add(new List<T>); 
    } 

Ne yazık ki Visual Studio, 'T tipi veya ad alanı bulunamadı' diyor. Bunu uygulayabilmem için bir yol var mı yoksa T yazısına bir liste mi yazdınız? sayesinde Peter

+1

Belki 'dinamik' anahtar sözcüğünü kullanın? .NET ... –

+1

'un doğru sürümünü varsayarsak, 'ArrayList' özelliğini kullanmayın, en kötü durum sadece'u kullanın, eğer – BrokenGlass

+0

@BrokenGlass'ı kullanmanız gerekiyorsa, muhtemelen bunu yapacağım, ancak bu sorun olan ArrayList değil. Çalışma Zamanı Türü ile Listenin oluşturulmasıdır. – 3Pi

cevap

18
Sen yansıma kullanabilirsiniz

:

List<object> database = new List<object>(); 
foreach (Type t in Types) 
{ 
    var listType = typeof(List<>).MakeGenericType(t); 
    database.Add(Activator.CreateInstance(listType)); 
} 
+0

Bu hile yapmış gibi görünüyor, teşekkür ederim. – 3Pi

+3

Bu işe yarıyor. Fakat Liste nesnesinin oluşturulması, sorunun sadece küçük bir kısmıdır. Ayrıca ona eleman eklemek zorunda kalacak. Ve daha kötüsü, daha kötüsü, onları oku. Bu kod, eleman tipini de bilmeyecektir. Burada "veritabanı" kelimesi verildiğinde bir ORM belirtilir. –

0

Sen türleri ve Generic Type Parameters için System.Type sınıfını karıştırıyorsun, burada bunu istediğiniz şekilde uygulamak için kodu şöyledir:

var lt = typeof(List<>); 
foreach (Type T in Types) 
{ 
    var l = Activator.CreateInstance(lt.MakeGenericType(T)); 
    DataBase.Add(l); 
} 
İlgili konular