Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取T数组的类型,而不指定T-type.GetType(";T[]";)_C#_Generics_Reflection - Fatal编程技术网

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[,,,])