使用长if else语句或使用反射进行强制转换



我有一个性能问题,使用c#而不是。net 4。

我得到一个分布式对象,我需要将其转换为许多类型中的一种。我的问题是:哪一种方式更好?

  1. 使用长if else (!)= null)语句。
  2. 获取反射对象的类型并使用一次成功的强制类型转换。

我认为没有比"profile it"更好的答案了,特别是在不知道你有多少类型的情况下。

如果可能的话,使用虚方法和多态-那么您不需要做任何事情-您只需调用:

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;
    ...
}

关于这个框架/BCL的例子,请看Expression.NodeType。

对于原语(long等),请查看Type.GetTypeCode(),它再次允许使用开关。如果它不是原始的,您可以通过在某个字典中预先注册您的期望的类型来做类似的事情,允许您(再次)翻转到switch .

最新更新