Yeni T zamanında çalışma zamanında dinamik olarak ayarlanmış yeni bir List<T>
oluşturmak mümkün mü?Dinamik Liste <T> tür
Şakalar
Yeni T zamanında çalışma zamanında dinamik olarak ayarlanmış yeni bir List<T>
oluşturmak mümkün mü?Dinamik Liste <T> tür
Şakalar
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);
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);
}
Neden downvotes? –
bir parametre listeniz varType ve bir yerel alan listesiTürü, bazı insanların bununla karıştırılacağını hayal ediyorum (düşürmedim) – Martin
evet sen, Mümkün bu
var asd = METHOD<Button>();
List<t> METHOD<t>()
{
return new List<t>();
}
neden? = (........ – Luiscencio
"Düğme" türü kodlanmış, çalışma zamanı belirlenemedi, çalışma zamanı – Martin
değil. Örnekte, derleme zamanında ayarlanmış. –
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));
}
(yeniden varyans; sınıflar için değil, yalnızca arabirimler/delegeler için de çalışır) –
@Marc, right ... 'IList
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;
}
Çalışmaları Şerefe! :) – AndrewC
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
@Lee, açıklama için teşekkürler. –