c# - 反射式地在 C# 中实现泛型类型推断

标签 c# generics reflection

我需要为脚本语言实现做一些通用类型推断,我想知道我是否遗漏了一些简单的方法。目前让我只询问类型结构并忽略边界。为了说明,这里有一个深度嵌套的例子:

T foo<T>( List<List<List<T>>> ) {...}

现在我想测试我是否可以传递类型为 bar 的参数:

List<List<List<string>>>

该方法,然后使用 MakeGenericMethod() 和发现的参数类型来具体化和调用它。

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

关于具体化 - 看起来我将不得不递归地爬行类型以找到与类型参数的位置匹配的参数类型,然后进行替换......我一直希望我可以能够以某种方式更直接地从参数类型构造可调用方法,但我不知道该怎么做。

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

谢谢, 帕特·尼迈耶

最佳答案

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

-帕特

关于c# - 反射式地在 C# 中实现泛型类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4495556/

相关文章:

c# - 使用 Entity Framework 在 C# 中违反代码契约(Contract)不变性

java - 在 Java 中从 C# 解密 RSA 加密数据。加密数据的格式?

java - 类型变量和参数的定义

java - 如何在接口(interface)中参数化,然后在实现的类中指定泛型类型

c# - 将对象转换为 Task<T> 并从类型为 Type 的变量设置 T

Java:没有默认构造函数的类的newInstance

reflection - golang 获取类型的 reflect.Type

c# - 在文本框中单击一次选择点击的单词

c# - 用于跨平台开发的单声道资源

generics - 是否可以在when语句中返回与类型参数相同的类型