将派生类转换为基泛型类

Convert Derived Class to Base Generic Class

提问人:1Mangomaster1 提问时间:12/24/2022 最后编辑:1Mangomaster1 更新时间:12/24/2022 访问量:49

问:

我的设置大致如下:

public class A { ... }
public class A<T> : A { ... }
public class B<T> : A<T> { ... }
public class C : B<SomeType> { ... }

我正在遍历 A 类型的列表,我想检查某些东西是否是 B 类型,如果是,请将其转换为......B...我可以看到它已经提出了一个问题,即我将如何获得类型......但是,如果我不能做到这一点,我还有什么其他选择呢?

编辑: 澄清一下,B 包含一个我想使用的方法,而 A 不包含它,因为它根本不需要它......我想检查该列表中的哪些对象属于 B 类型,以便我可以在它们上运行此方法

编辑2: 我之前忘了提到中间的A......很抱歉造成混乱

C# 继承 强制转换

评论


答:

1赞 David Browne - Microsoft 12/24/2022 #1

我想检查该列表中的哪些对象属于 B 类型

然后将类型 B 引入类型层次结构。目前你没有一个类型,你有一个不同的类型。所以BB<SomeType>

public class A { ... }

public abstract class B : A { ... }

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

public class C : B<SomeType> { ... }

或者在接口上声明所需的方法

public class A { ... }
public class A<T> : A { ... }
public interface IB
public class B<T> : A<T>, IB { ... }
public class C : B<SomeType> { ... }

然后对于任何 A,您可以检查它是否 .这可能是最自然的解决方案,因为 .NET 没有多重继承。is IB

评论

0赞 1Mangomaster1 12/24/2022
那是。。。一个问题...你看我的例子中真正的树是这样的:A、A<T>、B<T>、C......我不能在中间引入 B
0赞 Flydog57 12/24/2022
您可以,您必须更改代码,但与 .另一种选择是使用反射。调用,然后查询它是否是泛型类型,以及它是否是泛型类型以及是什么类型B<T>BGetTypethisB<T>T
0赞 1Mangomaster1 12/24/2022
我可以做到,我已经发现了一个堆栈溢出问题,讨论如何检查它是否属于某种泛型类型......但我不知道如何正确转换......我尝试了Convert.ChangeType,但没有成功
0赞 1Mangomaster1 12/24/2022
该界面可能是一个很好的,尽管看起来很奇怪的解决方案......但似乎是我最大的希望,所以我会这样做,谢谢!
0赞 Flydog57 12/24/2022
您无需将其转换为类型;它已经是该类型的对象。你不能做的是在没有显式强制转换的情况下将其分配给该类型的变量B<T>