Приводим длинные операторы if else или используя отражение - PullRequest
1 голос
/ 05 декабря 2011

У меня есть вопрос производительности, использующий C # поверх .Net4.

Я получаю распределенный объект, который мне нужно привести к одному из многих типов. У меня вопрос: какой путь лучше?

  1. Приведите его с помощью длинных операторов if else (! = Null).
  2. Получите тип объекта с отражением и используйте одно успешное приведение.

Ответы [ 2 ]

1 голос
/ 05 декабря 2011

Если возможно, используйте виртуальный метод и полиморфизм - тогда вам не нужно ничего делать - просто позвоните:

obj.SomeVirtualMethod(args);

и позвольте цифре virtual / override и т. Д.что делать.

Если объект находится под вашим контролем, и вы имеете в виду подтипы вашего определенного базового типа, то я бы рассмотрел добавление дискриминатора, то есть свойства enum, которое раскрывает природу базового типат. е.

Foo foo = ...
switch(foo.Actual)
{
    case FooType.Alpha: DoSomethingWith((Alpha) foo); break;
    case FooType.Beta: DoSomethingElseWith((Beta) foo); break;
    ...
}

Для примера Framework / BCL этого взгляните на Expression.NodeType.

Для примитивов (long и т. д.) посмотрите на Type.GetTypeCode(), который снова учитываетиспользование переключателя.Если это не примитивно, вы можете сделать нечто подобное, предварительно зарегистрировав свои ожидаемые типы в словаре где-нибудь, что позволит вам (снова) переключиться на switch.

1 голос
/ 05 декабря 2011

Не думаю, что здесь есть лучший ответ, чем «профилировать его», особенно если не знать, сколько у вас типов.

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