我有一个接口方法
public void Execute(ICommand command);
需要将已知的子类型传递ICommand
给适当的Handle(SpecificCommand command)
方法实现,并对未知类型进行一些通用处理.我正在寻找一种通用(即不需要巨大的开关)方法,类似于
Handle(command as command.GetType()); // this obviously does not compile
我知道我可以以某种方式注册处理程序,例如将它们作为Handle(...)
代理存储在字典中,但这仍然需要复制处理逻辑(一次在特定方法签名中,一次在委托重新注册中).如果我通过用反射检查我的类来填充字典(寻找Handle(XXX command)
方法),我会受到性能影响.
总结一下:我如何向下转换一个对象(通过调用来升级Execute(ICommand command)
)来调用一个需要具体类型的方法,而不知道它在编译时是哪种类型.
好吧,"正确"的答案是Handle()应该是ICommand中的一个方法,所以Handle(command)
你应该说,而不是command.Handle()
.
转换是在编译时发出的,因此您需要在编译时知道类型.重载也是在编译时确定的 - 所以当你真正知道要使用的具体类型时,为时已晚.
我没有看到你实际上是通过使用委托复制任何逻辑.或者,如果你使用反射进行,你可以使用Delegate.CreateDelegate非常轻松地构建委托 - 你只会获得一次性能,之后它会非常快.有关详细信息,请参阅我的有关Delegate.CreateDelegate的博客条目.
我想我决定使用一个手工制作的字典,或者根据我有多少种方法以及它们改变的频率来构建一个反射的字典.您可能会发现KeyedByTypeCollection对字典很有用.