测试对象是否在一组对象中的最佳方法?

问题描述:

我试图避免使用长的其他语句。测试对象是否在一组对象中的最佳方法?

可以说我有一个对象,我想测试它是否是ClassA,ClassB,ClassC等类型。

这是干净的方式吗?

+1

还有就是,根据定义,这样的不干净的方式。当然,你需要一个虚拟的方法。 – 2010-04-29 02:02:18

+0

好吧,只比我丑陋的其他链条更干净。 :) – jdelator 2010-04-29 04:55:17

喜欢的东西..

if (new[] { typeof(ClassA), typeof(ClassB), typeof(ClassC) }.Contains(obj.GetType())) 

显然,如果你有很多类型,并且看到不好的性能,那么把它扔进一个字典并使用ContainsKey。

+0

正是我在找什么。谢谢 – jdelator 2010-04-29 04:54:45

myobject.GetType()将产生对象类型以测试其与其他类型是否相等。

有一个你想测试的类型列表,然后询问列表是否包含你所拥有的对象的类型?

此外,不知道你为什么这样做。

但是也许像IsAssignableFrom(http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx)是你在找什么?

通常,当您必须测试一个对象的类型时,它可能表明您的设计出了问题。面向对象编程为我们提供了一种避免通过多态性构造这些类型的机会。

如果A,B和C在基类接口下实现了你提出的if语句的主体,那么你不需要上行测试吗?

例如:

abstract class A 
{ 
    public virtual void SomeBehavior() 
    { 
     Console.WriteLine("default behavior"); 
    } 
} 

class B:A 
{ 
    public override void SomeBehavior() 
    { 
     Console.WriteLine("type specific behavior"); 
    } 
} 

class C:A 
{ 
    public override void SomeBehavior() 
    { 
     Console.WriteLine("different behavior"); 
    } 
} 

class D:A{} 

void Main() 
{ 
    IEnumerable<A> myCollection=new A[]{new B(),new C(),new D()}; 
    foreach(A item in myCollection) 
    { 
     item.SomeBehavior(); 
    } 
} 
+0

我不能修改class a,b或c,但这对于任何人都可以很好地工作。 – jdelator 2010-04-29 04:53:55