2010-03-18 18 views

cevap

25

böyle bir şey yapmak, ancak mutlaka yararlı olamaz. Oluşturma kodu,

Type myType; 
    Type listType = typeof(List<>).MakeGenericType(myType); 
    IList myList = (IList)Activator.CreateInstance(listType); 
+0

Çalışmaları Şerefe! :) – AndrewC

+3

Lütfen 'güçlü yazılan' ve 'statik olarak yazılan' arasında bir fark olduğunu unutmayın. Burada statik tipini kaybedersiniz, ancak myList geçerli myType örnekleri olmayan nesneleri eklemenizi engeller. – Lee

+0

@Lee, açıklama için teşekkürler. –

9

Evet. Bunu, Type.MakeGenericType ve Activator.CreateInstance kullanarak Yansıma aracılığıyla yapabilirsiniz. Aslında olarak kesinlikle yazılı derlenmiş koddan kullanamadı çünkü jenerik kullanılarak

IList MakeListOfType(Type listType) 
{ 
    Type listType = typeof(List<>); 
    Type specificListType = listType.MakeGenericType(listType); 

    return (IList)Activator.CreateInstance(specificListType); 
} 
+0

Neden downvotes? –

+2

bir parametre listeniz varType ve bir yerel alan listesiTürü, bazı insanların bununla karıştırılacağını hayal ediyorum (düşürmedim) – Martin

-1

evet sen, Mümkün bu

var asd = METHOD<Button>(); 

    List<t> METHOD<t>() 
    { 
     return new List<t>(); 
    } 
+0

neden? = (........ – Luiscencio

+0

"Düğme" türü kodlanmış, çalışma zamanı belirlenemedi, çalışma zamanı – Martin

+0

değil. Örnekte, derleme zamanında ayarlanmış. –

1

Evet. Ancak, bu durumda T, çalışma zamanına kadar kararlaştırılmayacağından, genel bir türe sahip bir değişkene atayamazsınız. (Eğer T hem in ve out amaçlı List<T> tarafından kullanılır olmaz, .NET 4.0 kovaryans özelliği size yardımcı olmak ve IList<SomeSuperType> olarak değişken bildirsin edeceğini düşünüyorsun.)

Not alışılmadık "Yapılandırılmamış" genel türüne erişmek için <> sözdizimi. DataContractSerializer Bilinen Türleri İçin

public static System.Collections.IList ConstructGenericList(Type t) 
    { 
     return (System.Collections.IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(t)); 
    } 
+1

(yeniden varyans; sınıflar için değil, yalnızca arabirimler/delegeler için de çalışır) –

+0

@Marc, right ... 'IList 'yazmalıydım. Tamir ediyorum. –

1

Bunu türlerinden sadece sizin aksamından türleri değil, aynı zamanda listesini tedarik isteyebilirsiniz:

public static List<Type> GetKnownTypesForDataContractSerializer() 
{ 
    Assembly a = Assembly.GetExecutingAssembly(); 
    Type[] array = a.GetExportedTypes(); 

    List<Type> lista = array.ToList(); 

    lista = lista.FindAll(item => ((item.IsClass || item.IsEnum) & !item.IsGenericType & !item.IsAbstract == true)); 



    List<Type> withEnumerable = new List<Type>(); 
    foreach (Type t in lista) 
    { 
     withEnumerable.Add(t); //add basic type 

     //now create List<> type 
     Type listType = typeof(List<>); 
     var listOfType = listType.MakeGenericType(t); 

     withEnumerable.Add(listOfType); //add Type of List<basic type> 
    } 

    return withEnumerable; 
} 
İlgili konular