从继承自抽象类的对象列表中获取所有派生类型的List <type>

时间:2018-03-08 03:34:48

标签: c# inheritance reflection

我看过很多关于从基类型中获取所有类型的问题,等等,但这不是我需要的。例如,我有抽象基类:

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#有更好的方法来做到这一点。任何人吗?

2 个答案:

答案 0 :(得分:4)

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

parts.Select(x => x.GetType()).Distinct();

答案 1 :(得分:0)

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

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

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

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中存在的每种类型的一个实例。