小编Jan*_*Jan的帖子

在C#中打开泛型类继承动态识别

当我有两个非通用Type对象ab,我很容易验证是否是可分配的从b.通过使用所述a.IsAssignableFrom(b)功能.

class ClassBase { }
class ClassDerived : ClassBase { }
...
typeof(ClassBase).IsAssignableFrom(typeof(ClassDerived)) //returns true
Run Code Online (Sandbox Code Playgroud)

现在说我有两个通用接口:

interface IBase<T> { }
interface IDerived<T> : IBase<T> { }
Run Code Online (Sandbox Code Playgroud)

如果我关闭它们,我可以像以前一样做同样的行为,例如

typeof(IBase<object>).IsAssignableFrom(typeof(IDerived<object>)) //returns true
Run Code Online (Sandbox Code Playgroud)

事实上,任何T可用于关闭的东西IDerived也可用于关闭IBase并可IBase<T>IDerived<T>(对于特定的T)分配.

然而,

typeof(IBase<>).IsAssignableFrom(typeof(IDerived<>)) //returns false
Run Code Online (Sandbox Code Playgroud)

我有点想知道为什么会这样(他们可以关闭不同的类型,从而得到不可逆转的?).据我所知,在这种情况下确实返回true的函数有些不同.问题是:"可以IBase<T>IDerived<T>每个有效的分配T?" (感谢hvd)

我想做的是关闭泛型,然后询问它们是否可分配.但总的来说,我需要在最通用的类​​型下关闭b,这可能是a)丑陋,b)很难做到.

另一种方法是启动实现/继承树b并尝试将其与之比较a.

我的问题是,即使在一般情况下,是否有更简单的方法.

动机:一般兴趣,因为我最后并不需要这个.然而,当我使用Ninject和开放和封闭的泛型时,最初需要这个,我需要解决是否可以将开放的泛型类强制转换为开放的泛型接口(类).

c# generics

8
推荐指数
1
解决办法
948
查看次数

标签 统计

c# ×1

generics ×1