Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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#中的泛型类型推理_C#_Generics_Reflection - Fatal编程技术网

反射式实现C#中的泛型类型推理

反射式实现C#中的泛型类型推理,c#,generics,reflection,C#,Generics,Reflection,我需要为脚本语言实现进行一些泛型类型推断,我想知道我是否缺少一些简单的方法。现在让我只问一下类型结构,忽略边界。为了说明这一点,下面是一个深度嵌套的示例: T foo<T>( List<List<List<T>>> ) {...} tfoo(列表){…} 现在,我想测试是否可以通过以下类型的参数栏: List<List<List<string>>> 列表 然后对发现的参数类型使用MakeGenericMe

我需要为脚本语言实现进行一些泛型类型推断,我想知道我是否缺少一些简单的方法。现在让我只问一下类型结构,忽略边界。为了说明这一点,下面是一个深度嵌套的示例:

T foo<T>( List<List<List<T>>> ) {...}
tfoo(列表){…}
现在,我想测试是否可以通过以下类型的参数栏:

List<List<List<string>>>
列表
然后对发现的参数类型使用MakeGenericMethod()来具体化和调用它

据我所知,即使我设法构造了一个与foo参数等价的开放泛型类型(即
List
),它也不会使用isAssignable()进行测试。我不确定是否有一些技巧来检查开放泛型类型的可分配性,或者它是否根本不受支持。我想如果有必要,我可以直接做

在具体化方面——看起来我必须递归地遍历类型,找到与类型参数位置匹配的参数类型,然后进行替换。。。我一直希望能够以某种方式更直接地从参数类型构造invocable方法,但我不知道如何做到这一点

任何已经经历过这种疯狂的人的建议都将不胜感激:)

谢谢,
Pat Niemeyer

因此,我相信我已经成功地实现了这一点,前提是您必须具体化类型以进行可分配性比较。据我所知,甚至没有一种方法可以从泛型类型中提取基类型,以便自己执行赋值检查。因此,我最终要做的是使用GetGenericArguments并行遍历方法参数类型和参数类型,在每个步骤(与泛型参数匹配的数量等)执行健全性检查,并在最终找到“裸”泛型类型param后,注意参数中对应的(推断的)类型。您可以使用IsGenericParameter确定已找到类型参数。然后,奇怪的是,您必须将这些类型保存在一边,并通过按特定顺序将它们传递给MakeGenericMethod来使用它们来实例化方法。顺序是由类型本身的属性GenericParameterPosition(同样奇怪)为您提供的,但简单的orderby会对它们进行排序。在那之后,所有的正常规则似乎都适用了


-Pat

不确定问题到底是什么-您是否试图在方法foo中获得typeof(T),因为这很琐碎!例如,return(T)Activator.CreateInstance(typeof(T))@mho:不,OP正在试图找出最佳方法来确定使用
List
参数调用此方法是否有效,该参数使用
string
作为类型参数:即
method.MakeGenericMethod(typeof(string)).Invoke(someObject,新对象[]{someListofListofString})
可以。请查看
GetGenericTypeDefinition()
。是否有机会分享您的解决方案?