我需要为脚本语言实现做一些通用类型推断,我想知道我是否缺少一些简单的方法。暂时让我问一下类型结构并忽略边界。为了说明,这是一个深层嵌套的例子:
T foo<T>( List<List<List<T>>> ) {...}
现在我想测试是否可以传递类型为
的参数栏List<List<List<string>>>
到该方法,然后使用带有已发现的param类型的MakeGenericMethod()来实现并调用它。
据我所知,即使我设法构造一个等同于foo参数的开放泛型类型(即List<List<List<T>>>
),它也不会使用isAssignable()进行测试。我不确定是否有一些技巧来检查开放泛型类型的可分配性,或者它是否根本不受支持。我想如果必须,我可以直接这样做。
关于具体化 - 看起来我将不得不递归地遍历类型以找到与类型参数的位置匹配的参数类型然后进行替换...我一直希望我可能能够以某种方式更直接地从参数类型构造可调用方法,但我没有看到如何做到这一点。
任何已经经历过这种疯狂的人的建议都会受到赞赏:)
感谢, Pat Niemeyer
答案 0 :(得分:1)
所以,我相信我已经成功实现了这个假设,你必须为可分配性比较重新确定类型。就像我所知,甚至没有办法从泛型类型中提取基类型以便自己执行赋值检查。所以我最终做的是使用GetGenericArguments并行遍历方法参数类型和参数类型,在每一步执行完整性检查(通用参数匹配的数量等),并最终找到“裸”泛型类型参数,注意参数中的相应(推断)类型。您可以使用IsGenericParameter确定已找到类型参数。然后,奇怪的是,您必须将这些类型保存在一边,并使用它们通过以特定顺序将它们传递给MakeGenericMethod来实例化该方法。订单是由Type本身的属性GenericParameterPosition(再次,奇怪)提供给你的,但是一个简单的orderby将它们排序。之后,所有正常规则似乎都适用。
-Pat