1

这是我的代码。我是泛型的新手,所以只是想知道是否有更好的方法来做我所做的事情。

public interface IMessageHandler<T>  where T : IMessage
{
    void Handle(T message);
}

public class MessageANotificationHandler : IMessageHandler<MessageA>
{
    public void Handle(MessageA message)
    {
        // do something;
    }

}

现在我希望我的应用程序接收所有实现 IMessage 的消息,但会自动找出用于特定消息的处理程序。我已经完成了以下操作,但感觉必须有更好的方法

public class MessageHandlerFactory
{
    public Type GetMessageHandlerType(IMessage message)
    {
        if (message.GetType() == typeof(MessageA))
            return typeof(MessageANotificationHandler);

        return null;
    }
}

然后在我的应用程序中,我使用反射来创建工厂返回的类型的实例并调用 Handle 方法。

如果您知道任何使此代码更好的方法,请提供帮助。

谢谢

4

2 回答 2

2

我会删除工厂和IMessageHandler界面..它们不是必需的。

我会将Handle方法添加到IMessage接口中,而不是这样:

public void HandleMessageFor(IMessage msg) {
    Type t = new MessageHandlerFactory().GetMessageHandlerType(msg);
    // Activator.CreateInstance.. etc etc..
}

你可以简单地拥有..

public void HandleMessageFor(IMessage msg) {
    msg.Handle();
}
于 2012-08-08T03:01:23.210 回答
0

您可以IMessage改为创建一个抽象基类,并拥有一个方法:

public abstract class MessageBase {
    public abstract IMessageHandler GetHandler();
}

这将需要IMessageHandler是非通用的。

于 2012-08-08T02:50:39.560 回答