我有一个性能问题,使用c#而不是。net 4。
我得到一个分布式对象,我需要将其转换为许多类型中的一种。我的问题是:哪一种方式更好?
- 使用长if else (!)= null)语句。
- 获取反射对象的类型并使用一次成功的强制类型转换。
我认为没有比"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
.