belirtmeden bir T türünün türünü elde etme Genel tür belirtmeden, bir genel tür dizisini ifade eden bir tür oluşturmaya çalışıyorum. Yani, Type.GetType("T[]")
eşdeğerini yapmak istiyorum.T - Type.GetType ("T []")
Bunu bir dizi dışı türüyle nasıl yapacağımı biliyorum. Örneğin.
Type.GetType("System.Collections.Generic.IEnumerable`1")
// or
typeof(IEnumerable<>)
Sorunu yeniden üreten bazı örnek kodlar.
using System;
using System.Collections.Generic;
public class Program
{
public static void SomeFunc<T>(IEnumerable<T> collection) { }
public static void SomeArrayFunc<T>(T[] collection) { }
static void Main(string[] args)
{
Action<Type> printType = t => Console.WriteLine(t != null ? t.ToString() : "(null)");
Action<string> printFirstParameterType = methodName =>
printType(
typeof(Program).GetMethod(methodName).GetParameters()[0].ParameterType
);
printFirstParameterType("SomeFunc");
printFirstParameterType("SomeArrayFunc");
var iEnumerableT = Type.GetType("System.Collections.Generic.IEnumerable`1");
printType(iEnumerableT);
var iEnumerableTFromTypeof = typeof(IEnumerable<>);
printType(iEnumerableTFromTypeof);
var arrayOfT = Type.GetType("T[]");
printType(arrayOfT); // Prints "(null)"
// ... not even sure where to start for typeof(T[])
}
}
çıktısı:
System.Collections.Generic.IEnumerable`1[T]
T[]
System.Collections.Generic.IEnumerable`1[T]
System.Collections.Generic.IEnumerable`1[T]
(null)
I "(null değeri)" bu son düzeltmek istiyorum. Zaten çoğunlukla GetMethods()
sonucunu filtreleyerek çalışan kodumu ele verdik
var someMethod = someType.GetMethod("MethodName", new[] { typeOfArrayOfT });
// ... call someMethod.MakeGenericMethod some time later
, bu nedenle bu fazlasıdır:
Bu
yöntem imzası belirterek yansımaları üzerinden bir fonksiyonun bir aşırı almak için kullanılacak bilgi ve anlayış içinde bir egzersiz.
Güzel. Bunu kendim düşünmezdim. –
+1: Hala biraz dağınık (çünkü IEnumerable <> 'sadece bir örnekti - hedef kodumda bir alakası yok), ama bu bir cazibe gibi çalışıyor :) 'Type.GetType (") almanın daha temiz bir yolu var mı? T ')'? –
Bu, yöntemlere bağlamanıza yardımcı olmaz, çünkü IEnumerable'daki T tipi parametresi, SomeFunc () öğesindekiyle aynı T değildir. –
phoog