C# 获取T数组的类型,而不指定T-type.GetType(";T[]";)
我试图创建一个引用泛型类型数组的类型,而不指定泛型类型。也就是说,我想做与C# 获取T数组的类型,而不指定T-type.GetType(";T[]";),c#,generics,reflection,C#,Generics,Reflection,我试图创建一个引用泛型类型数组的类型,而不指定泛型类型。也就是说,我想做与Type.GetType(“T[])等效的工作 我已经知道如何使用非数组类型执行此操作。例如 Type.GetType("System.Collections.Generic.IEnumerable`1") // or typeof(IEnumerable<>) 我想更正最后一个“(空)” 这将用于通过指定方法签名,通过反射获得函数重载: var someMethod = someType.GetMethod
Type.GetType(“T[])
等效的工作
我已经知道如何使用非数组类型执行此操作。例如
Type.GetType("System.Collections.Generic.IEnumerable`1")
// or
typeof(IEnumerable<>)
我想更正最后一个“(空)”
这将用于通过指定方法签名,通过反射获得函数重载:
var someMethod = someType.GetMethod("MethodName", new[] { typeOfArrayOfT });
// ... call someMethod.MakeGenericMethod some time later
我的代码主要是通过过滤GetMethods()
的结果来工作的,因此这更像是一个知识和理解方面的练习。简单:
var arrayOfT = typeof(IEnumerable<>).GetGenericArguments()[0].MakeArrayType();
var arrayOfT=typeof(IEnumerable).GetGenericArguments()[0].MakeArrayType();
这个怎么样
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的多维数组类型。返回类型的实例不一定是基于零的
向量类型用一对方括号表示(例如,
System.Int32[]
),而秩1数组类型用一对包含星号的方括号表示(例如,System.Int32[*]
)。+1:仍然有点凌乱(因为IEnumerable
只是一个例子-它在我的目标代码中没有相关性),但这就像一个魅力:)有没有更干净的方法来获取Type.GetType(“t”)
?但这不会帮助你绑定到方法,因为IEnumerable中的T类型参数与SomeFunc()中的T类型参数不同。@Merlyn-我不认为这更干净。您要求指定一个尚未指定的类型,因此我认为这是一个棘手的问题。使用IEnumerable
是一个很好的选择,因为它是.NET framework中的基本类型,因此保证存在并且永远不会破坏您的代码。@MerlynMorgan Graham我通过对我的答案的评论回到这个问题上来。我更愿意说DeclaringMethod属性反映了一个事实,即一个方法的T
与IEnumerable
的T
不同,这并不是造成这种差异的原因。两者都是类型参数,但它们在不同的位置声明,因此具有相同的名称并不意味着它们与具有不同名称的情况相同。这类似于Math.Sqrt(float d)
的d
参数与Math.Log(float d)
的d
参数不同。这很接近,但不是我想要的。我特别需要T[]。看看我为什么要在问题的底部使用这种类型。哈哈,MakeArrayType(typeof(string),1)
真的比typeof(string)好吗。MakeArrayType(1)
?@Merlyn Morgan-Graham:你会发现谜的答案也不允许你做你在问题底部指出的事情。事实上,我能让它工作的唯一方法是使用GetMethods()获得正确的方法,然后使用该方法的类型参数调用GetMethod(一个相当无用的练习),如下所示:var sameMethod=typeof(Program).GetMethod(“SomeArrayFunc”,flags,null,new[]{method.GetGenericArguments()[0]},null)
@phoog:你应该把这个评论作为一个答案:)在这样的答案中,指出IEnumerable
中的T
和该方法中的T
之间的区别可能是有用的。@JonathanDickinson感谢你指出这一点。我已经更正了我的答案,并详细阐述了一点。
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[,,,])