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

问题描述 投票:0回答:2

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

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

c# inheritance reflection
2个回答
4
投票

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

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

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.