ortaya çıkar - Liste türü olan eleman tipi parametresinde covariant değil. Ne yazık ki jenerik yöntemin bir daktilo sürümü almak ve yansıma kullanarak aramak gerekir:
Type listItemType = typeof(int); // cheating for simplicity - see below for real approach
MethodInfo openMethod = typeof(Extension).GetMethod("ToDataTable", ...);
MethodInfo typedMethod = openMethod.MakeGenericMethod(typeof(listItemType));
typedMethod.Invoke(null, new object[] { list });
alternatif IList
yerine IList<T>
kabul Uzantınız yönteminin bir sürümünü oluşturmak için olabilir. List<T>
sınıf olmayan bu genel arabirimi yanı sıra genel arabirimi uygulayan, böylece aramak mümkün olacak:
public static DataTable WeakToDataTable(this IList list) { ... }
((IList)list).WeakToDataTable();
(Gerçekte muhtemelen farklı bir isim yerine bir aşırı kullanmak istiyorum - sadece kullanılarak farklı isim farklı seslenmesini)
diğer bilgiler:. yansıması çözümde, ben liste elemanı tipini nasıl belirleneceği sorunu üzerinden atlanır. Bu ne kadar karmaşık olmak istediğinize bağlı olarak biraz zor olabilir. Eğer nesne (bazı T) bir List<T>
olacağını varsayıyoruz, o zaman kolay:
Type listItemType = list.GetType().GetGenericArguments()[0];
Eğer IList<T>
varsaymak sadece istekli iseniz uygun bulmak gerekir çünkü o zaman, biraz daha zor Arayüz ve bunun genel argümanını alın. Ve GetInterface() öğesini kullanamazsınız çünkü genel bir arabirimin kapalı yapılandırılmış bir örneğini ararsınız. Yani IList<T>
bir örneğidir biri için arayan tüm arayüzleri aracılığıyla sürünmek zorunda: meta veri değil, liste içeriği söner çünkü bu boş listeleri için çalışacak
foreach (Type itf in list.GetType().GetInterfaces())
{
if (itf.IsGenericType && itf.GetGenericTypeDefinition == typeof(IList<>)) // note generic type definition syntax
{
listItemType = itf.GetGenericArguments()[0];
}
}
.
Neden List
Derleme zamanında, ne tür bir liste olduğunu bilmediği için: “” Listesini bilmiyor. Bir temel sınıfa (ki, haklı olarak not edersiniz, işe yaramaz, çünkü '' '' '' int '' object' ile uyumlu olsa bile 'List