【发布时间】:2014-12-18 04:24:35
【问题描述】:
我正在寻找一些关于以下方面的更时尚的解决方案:在我的消息总线实现中,当新消息发布到总线时,我有几个订阅事件的组件。消息总线传输 BusMessage 对象(其值为object)。每个组件另外实现一个函数来处理特定的总线消息(派生的组件可以覆盖某些消息类型的现有句柄函数),例如对于传入的字符串类型的总线消息:
protected virtual void HandleMessage(BusMessage<string> msg) { ... }
为了将传入的消息分发到特定的句柄函数,我实现了一个
static bool TryClassify<T>(BusMessage msg, Action<BusMessage<T>> handleFunction)
该方法接受一个 T 并检查给定的 BusMessage 是否实际上是 BusMessage<T>,这意味着它的值是 T 类型。事件处理程序始终如下:
void HandleMessage(BusMessage msg)
{
if (BusMessage.TryClassify<string>(msg, HandleMessage)) return;
}
对于我想在组件中处理的每个特定 BusMessage 类型,我必须一遍遍地用 TryClassify 重复这一行 - 唯一的区别是我指定的类型,因为要使用的特定 HandleMessage 由编译器确定.我最终得到了一个由
组成的方法体if (BusMessage.TryClassify<string>(msg, HandleMessage)) return;
if (BusMessage.TryClassify<bool>(msg, HandleMessage)) return;
if (BusMessage.TryClassify<long>(msg, HandleMessage)) return;
if (BusMessage.TryClassify<int>(msg, HandleMessage)) return;
if (BusMessage.TryClassify<DateTime>(msg, HandleMessage)) return;
...
是否有一种更优雅、更时尚且样板代码更少的方式来完成我的需求?使用数组类型{ typeof(string), typeof(bool), typeof(long), typeof(int), typeof(DateTime) } 的方向可能是什么?
【问题讨论】:
-
我假设您想避免使用动态类型?你目前有多少地方有这种重复?如果它只是在一个方法中,我可能会保持原样。
-
在了解并查看了 Illidans4 对问题的解决方案后,我同意你的看法,并保持我的代码原样——即使至少有两个几十个地方被维护,将来也会更容易维护堆满了几乎相同的代码行。