我有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有点帮助,但并不完美:/
答案 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()
。