Лучший способ проверить, находится ли объект в наборе объектов? - PullRequest
0 голосов
/ 29 апреля 2010

Я пытаюсь избежать использования длинного оператора if.

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

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

Ответы [ 4 ]

5 голосов
/ 29 апреля 2010

Часто, когда вам нужно проверить тип объекта, это может быть признаком того, что с вашим дизайном что-то не так.Объектно-ориентированное программирование дает нам возможность избегать такого рода конструкций с помощью полиморфизма.

Разве не было бы лучше, если бы 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();
    }
}
3 голосов
/ 29 апреля 2010

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

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

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

2 голосов
/ 29 апреля 2010

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

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

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

0 голосов
/ 29 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...