我正试图避免使用长期的if语句。
假设我有一个对象,我想测试它是ClassA,ClassB,ClassC等类型。?
这样做的干净方法是什么?
答案 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()将生成对象类型以测试与其他类型的相等性。