作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下基本接口(interface)
public interface IHandler{
void Handle(IMessage message);
}
以及继承基础接口(interface)的通用接口(interface)
public interface IHandler<TMessage> : IHandler where TMessage : IMessage{
void Handle(TMessage message);
}
我的类可以实现接口(interface)IHandler<TMessage>
多次。 IMessage
是消息的基本接口(interface),与此处无关。目前我按如下方式实现接口(interface)。
public class ExampleHandler : IHandler<ExampleMessage>, IHandler<OtherExampleMessag>{
void IHandler.Handle(IMessage message){
ExampleMessage example = message as ExampleMessage;
if (example != null) {
Handle(example);
}
else {
OtherExampleMessage otherExample = message as OtherExampleMessage;
if (otherExample != null) {
Handle(otherExample);
}
}
public void Handle(ExampleMessage) {
//handle message;
}
public void Handle(OtherExampleMessage) {
//handle message;
}
}
困扰我的是我必须实现 Handle(IMessage)
的方式方法,因为在我看来它有很多冗余代码,每次我实现一个新的 IHandler<TMessage>
时我都必须扩展这个方法。我类的界面。
我正在寻找的是一种更通用的方式来实现 Handle(IMessage)
方法(可能在 Handlers 的基类中),但我目前不知道该怎么做。
最佳答案
您可以使用新的 dynamic
将重载决议移至 DLR 的关键字:
void IHandler.Handle(IMessage message)
{
dynamic d = message;
Handle(d);
}
请注意,这将在运行时失败并返回 RuntimeBinderException
如果传入的消息对您的类(class)无效。
为避免此异常,您可以为所有未知消息类型添加一个处理程序:
private void Handle(object unknownMessage)
{
// Handle unknown message types here.
}
实现IHandler.Handle
在基类中,您需要做更多的工作:
public class BaseHandler : IHandler
{
void IHandler.Handle(IMessage message)
{
dynamic d = message;
Handle(d);
}
private void Handle<TMessage>(TMessage message) where TMessage : IMessage
{
var handler = this as IHandler<TMessage>;
if(handler == null)
HandleUnknownMessage(message);
else
handler.Handle(message);
}
protected virtual void HandleUnknownMessage(IMessage unknownMessage)
{
// Handle unknown message types here.
}
}
您的特定处理程序将如下所示:
public class ExampleHandler : BaseHandler,
IHandler<ExampleMessage>,
IHandler<OtherExampleMessage>
{
public void Handle(ExampleMessage message)
{
// handle ExampleMessage here
}
public void Handle(OtherExampleMessage message)
{
// handle OtherExampleMessage here
}
}
这段代码现在是这样工作的:
BaseHandler.Handle<TMessage>
具有真实消息类型的方法,即 TMessage
不会是IMessage
但是像ExampleMessage
这样的具体消息类.HandleUnknownMessage
处理未知的消息类型。Handle
特定消息处理程序上的方法,有效地将调用委托(delegate)给具体的处理程序实现。关于c# - 泛型方法的可重用非泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12855930/
我是一名优秀的程序员,十分优秀!