我正在尝试创建一个引用泛型类型数组的类型,而不指定泛型类型。也就是说,我想做相当于Type.GetType("T[]")
。
我已经知道如何使用非数组类型执行此操作。 E.g。
Type.GetType("System.Collections.Generic.IEnumerable`1")
// or
typeof(IEnumerable<>)
以下是一些重现问题的示例代码。
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[])
}
}
输出结果为:
System.Collections.Generic.IEnumerable`1[T]
T[]
System.Collections.Generic.IEnumerable`1[T]
System.Collections.Generic.IEnumerable`1[T]
(null)
我想纠正最后一个“(null)”。
这将通过指定方法签名来通过反射来获取函数的重载:
var someMethod = someType.GetMethod("MethodName", new[] { typeOfArrayOfT });
// ... call someMethod.MakeGenericMethod some time later
我已经通过过滤GetMethods()
的结果来获取我的代码,所以这更像是一种知识和理解的练习。
答案 0 :(得分:8)
简单:
var arrayOfT = typeof(IEnumerable<>).GetGenericArguments()[0].MakeArrayType();
答案 1 :(得分:1)
这个怎么样?
Type MakeArrayType(Type elementType, int rank)
{
return elementType.MakeArrayType(rank);
}
的示例:
var x = MakeArrayType(typeof(string), 1); // x == typeof(string[])
var y = MakeArrayType(typeof(float), 4); // y == typeof(float[,,,])
修改
正如Jonathan Dickinson指出的那样,elementType.MakeArrayType(1)不会返回与elementType.MakeArrayType()相同的类型。我不会修改原始代码示例,因为它无法回答问题。
Type.MakeArrayType(1)和Type.MakeArrayType()之间的区别在于后者返回一个矢量类型 - 它必须是1维和从零开始 - 而前者返回发生的多维数组类型排名1.返回类型的实例不一定是从零开始的。
向量类型用一对方括号表示(例如,System.Int32[]
),而rank-1数组类型用一对包含星号的方括号表示(例如,{{1} })。