2010-04-29 2 views
0

Я пытаюсь избежать использования инструкции long else if.Лучший способ проверить, находится ли объект в наборе объектов?

Допустим, у меня есть объект, и я хочу проверить, имеет ли он тип ClassA, ClassB, ClassC и т. Д.?

Что такое чистый способ сделать это?

+1

Существует, по определению, не чистый способ сделать это. Конечно, вам нужен виртуальный метод. –

+0

Ну просто чище, чем моя уродливая, если цепь. :) – jdelator

ответ

3

Что-то вроде ..

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

?

И, очевидно, если у вас много типов и вы видите плохую производительность, то бросьте его в словарь и используйте ContainsKey.

+0

Именно то, что я искал. Спасибо – jdelator

0

myobject.GetType() даст тип объектов для проверки равенства для других типов.

2

есть список типов, которые вы хотите протестировать, а затем запросить список, если он «содержит» тип объекта, который у вас есть?

Кроме того, не уверен, почему вы это делаете.

Возможно, что-то вроде IsAssignableFrom (http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx) - это то, что вы ищете?

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(); 
    } 
} 
+0

Я не могу изменить класс a, b или c, но это будет очень хорошо работать для тех, кто может. – jdelator

Смежные вопросы