gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:24:17 28 4
gpt4 key购买 nike

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

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com