gpt4 book ai didi

c# - C#中开启泛型类型继承动态识别

转载 作者:太空狗 更新时间:2023-10-29 19:46:02 24 4
gpt4 key购买 nike

当我有两个非泛型 Type对象 ab ,我可以使用 a.IsAssignableFrom(b) 轻松验证 a 是否可以从 b 分配。功能。

class ClassBase { }
class ClassDerived : ClassBase { }
...
typeof(ClassBase).IsAssignableFrom(typeof(ClassDerived)) //returns true

现在假设我有两个通用接口(interface):

interface IBase<T> { }
interface IDerived<T> : IBase<T> { }

如果我关闭它们,我可以做和以前一样的事情,具有完全相同的行为,例如

typeof(IBase<object>).IsAssignableFrom(typeof(IDerived<object>)) //returns true

事实上,任何T可用于关闭IDerived也可以用来关闭IBaseIBase<T>可从 IDerived<T> 分配(对于那个特定的 T)。

但是,

typeof(IBase<>).IsAssignableFrom(typeof(IDerived<>)) //returns false

我有点知道为什么会这样(它们可以在不同类型上关闭,从而变得不可转换?)。我知道在这种情况下确实返回 true 的函数因此有些不同。问题是:“IBase<T> 是否可以从 IDerived<T> 分配给每个有效的 T?” (感谢 hvd)

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

另一种方法是在 b 上向上攀登实现/继承树。并尝试将其与 a 进行比较.

我的问题是即使在一般情况下是否有更简单的方法来做到这一点。

动机:一般兴趣,因为最后我实际上并不需要这个。但是,当我将 Ninject 与开放式和封闭式泛型一起使用时,最初的需求就出现了,我需要解决开放式泛型类是否可以转换为开放式泛型接口(interface)(类)的问题。

最佳答案

如您所知,typeof(IBase<>).IsAssignableFrom(typeof(IDerived<>))永远不会返回 true,因为这两个开放泛型类型不在彼此的继承层次结构中。

My question is whether there is an easier way of doing this even in general cases.

不,不是容易,而是……

如果T对于您正在检查可分配性的两种泛型类型中的任何一种都没有任何约束( where T: ... )我认为您可以使用 object 构造封闭的泛型类型作为类型参数,然后使用 IsAssignableFrom关于构造类型。

如果T受任何泛型类型的约束,您将必须使用反射来查找这些约束( Type.GetGenericArgumentsType.GetGenericParameterConstraints ),然后使用该信息构造泛型类型。在这种情况下,约束类型必须仍然相同,因为 A<T> : B<T>继承(相同的 T )以便在两个泛型类型之间具有可分配性的可能性。请注意,如果一个约束类型继承另一个约束类型,那么如果您使用两个约束类型中最派生的类型构造它们,您将发现泛型类型的可分配性。

这里有一些例子:

    public class A<T> {}
public class B<T> : A<T> {}

public class C<T> where T: E {}
public class D<T> : C<T> where T: F {}

public class E {}
public class F : E {}
public class G : F {}

typeof(A<>).IsAssignableFrom(typeof(B<>)) // false
typeof(A<object>).IsAssignableFrom(typeof(B<object>)) // true
typeof(A<string>).IsAssignableFrom(typeof(B<string>)) // true
typeof(C<E>).IsAssignableFrom(typeof(D<F>)) // false
typeof(C<F>).IsAssignableFrom(typeof(D<F>)) // true
typeof(C<G>).IsAssignableFrom(typeof(D<G>)) // true

关于c# - C#中开启泛型类型继承动态识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11826731/

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