使用反射创建开放泛型类型时忽略约束

时间:2017-04-05 08:19:21

标签: c# generics reflection mono

我处理的代码比较C#中的类结构作为序列化库的一部分。

我偶然发现了特定泛型类设置的问题:

class B<Y> where Y: B<Y> {}
class A<X>: B<A<X>> {}

我已经有Type类型的对象代表 open 泛型类型B<> open 泛型类型A<>。现在我想创建 open 泛型类型B<A<>>,我将其用作其他已关闭泛型类型的模板。为此,我尝试使用MakeGenericType方法:

typeof(B<>).MakeGenericType(typeof(A<>))

但最终出现了“无效的通用参数”的例外情况。这是有道理的,因为类型A<>不符合Y泛型参数的约束。

我知道我可以通过调用typeof(A<>).BaseType来获取我想要的类型,但它不符合我的算法流程,似乎不是解决问题的一般方法。我的问题是:有没有办法创建一个打开类型B<A<>> 忽略/推迟约束检查到创建已关闭它的版本?

1 个答案:

答案 0 :(得分:0)

感谢@thehennyy的评论,我确认这是Linux Mono 4.8.0中的一个错误。我报告了它here并等待反应。