获取一份清单 从抽象类继承的对象列表中的所有派生类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取一份清单 从抽象类继承的对象列表中的所有派生类型相关的知识,希望对你有一定的参考价值。

我已经看到了一些问题,涉及从基类型中获取所有类型等等,但这不是我需要的。例如,我有和抽象基类:

public abstract class BasePart
{
    //whatever 
}

我有一大堆来自它的课程。喜欢...

public class HorizontalPanel : BasePart { //code }
public class VerticalPanel : BasePart { //code }
public class RainBoard : BasePart { //code }

等等。我总是按基类列出它们:

List<BasePart> parts;

我使用类型转换和泛型来做任何我想要的事情。但是,我来到了需要过滤此列表的位置,我只想要其中提供的类型信息。只有一次类型。例如,如果我的列表有三个Horizo​​ntalPanels和两个VerticalPanels,我想要的是一个仅包含List<Type>{HorizontalPanel, VerticalPanel}。我想我可以在链式循环中弄乱对象本身以获得我想要的东西,但我很肯定C#有更好的方法来做到这一点。任何人?

答案

没有语言功能可以帮助您解决此问题。最简单的方法是使用LINQ,首先使用Select获取所有类型并使用Distinct

parts.Select(x => x.GetType()).Distinct();
另一答案

您可以使用Object.GetType()检索对象的类型并填充列表。

之后,由于您需要一个仅包含每种类型的一个实例的列表,您可以在之前填充的列表中调用Enumerable.Distinct(),并使用Enumerable.ToList()将生成的可枚举转换为列表。

总而言之,代码将类似于:

List<Type> types = new List<Types>();

foreach (Base element in MyList){
    types.add(element.GetType());
};

List<Type> unique_types = types.Distinct().ToList();

这将为您提供列表unique_types,其中只填充MyList中存在的每种类型的一个实例。

以上是关于获取一份清单 从抽象类继承的对象列表中的所有派生类型的主要内容,如果未能解决你的问题,请参考以下文章

Python(面向对象编程——2 继承派生组合抽象类)

如何从 C++ 基类继承抽象行为

12.面向对象(继承/super/接口/抽象类)

面向对象:继承抽象类抽象方法虚方法

面向对象设计思想之一(构造器和继承)

绑定与非绑定方法 继承 继承与抽象 查找属性关系 派生与覆盖 访问父类的内容