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

时间:2010-04-29 01:42:00

标签: c# .net oop

我正试图避免使用长期的if语句。

假设我有一个对象,我想测试它是ClassA,ClassB,ClassC等类型。?

这样做的干净方法是什么?

4 个答案:

答案 0 :(得分:5)

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

如果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();
    }
}

答案 1 :(得分:3)

像...这样的东西。

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

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

答案 2 :(得分:2)

有一个你要测试的类型列表然后询问列表它是否“包含”你拥有的对象类型?

另外,不确定你为什么这样做。

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

答案 3 :(得分:0)

myobject.GetType()将生成对象类型以测试与其他类型的相等性。