从列表中过滤抽象类

时间:2016-01-04 19:26:56

标签: c#

我有new List<AbstractClass> ()包含一些不同的实现。我想根据具体情况筛选出一些实现。怎么做得好?

1) if (condition1 && type is Implementation1) ...

2) if (condition2 && implementation.Name == "Implementation 1") ...

3) if (condition3 && implementation.Type == EnumType.Type1) ...

我认为1)不好,2)在编译时不起作用3)可能好吗?

对其他设计的任何建议?

(因为禁止而不能将它发布在程序员身上。)

编辑: 更多细节。想象一下抽象类(或接口):

class abstract MessagePrinter
{ 
    void Print (string message);
}

和类ConsolePrinter : MessagePrinter在控制台上打印消息。因此,当由于某些原因我想停止在控制台上打印消息时,我需要从List<MessagePrinter>中删除该实现。但是如果ConsolePrinter使用UpperCaseMessagePrinter包装怎么办?

class UpperCaseMessagePrinter : MessagePrinter
{
    public UpperCaseMessagePrinter (MessagePrinter source) { /* ... */ };

    void Print (string message)
    {
        source.Print (message.ToUpper());
    }
 }

所有类型检查都没用。带有枚举的解决方案#3有点帮助,但并不完美:/

2 个答案:

答案 0 :(得分:0)

查看.OfType扩展方法进行过滤。

class Base {}
class Derived : Base {}

var listOfBase = new List<Base>();
// ...
var enumerableOfDerived = listOfBase.OfType<Derived>();

答案 1 :(得分:0)

如果在编译期间知道类型,那么我会选择使用typeof(...)运算符。

如果在编译期间不知道类型,那么您必须通过System.Type检查Object.GetType()