c# - 如何实现非泛型接口并使用泛型调用
问题描述
可能是一个糟糕的标题,但我试图从我的通用处理程序类中抽象出类型“EventHub”。
我想在我的 subscribe 方法中注入一个函数来解耦这两种类型。不幸的是,我能看到这样做的唯一方法是让我的 IHandler 成为泛型,但这会导致其他问题。
有没有一种设计模式可以解耦这两种类型?以某种方式注释掉的是我想要的行。
public interface IHandler
{
//void Subscribe(Func<Action<T>, Guid> subscribe);
void Subscribe(EventHub eventHub);
void Unsubscribe(Action<Guid> action);
}
public abstract class Handler<T> : IHandler
{
private Guid _subscriptionToken;
public virtual void Subscribe(EventHub eventHub)
{
var action = new Action<T>(Handle);
_subscriptionToken = eventHub.Subscribe(action);
}
/*public virtual void Subscribe(Func<Action<T>, Guid> subscribe)
{
var action = new Action<T>(Handle);
_subscriptionToken = subscribe(action);
}*/
public virtual void Unsubscribe(Action<Guid> action)
{
action(_subscriptionToken);
}
public abstract void Handle(T eventType);
}
谢谢您的帮助!
解决方案
internal interface IHandler
{
void Subscribe(Func<Action<object>, Guid> subscribe);
void Unsubscribe(Action<Guid> action);
}
public abstract class Handler<T> : IHandler
{
private Guid _subscriptionToken;
public virtual void Subscribe(Func<Action<object>, Guid> subscribe)
{
var action = new Action<T>(HandleNonAsync);
_subscriptionToken = subscribe(Convert(action));
}
public virtual void Unsubscribe(Action<Guid> action)
{
action(_subscriptionToken);
}
public abstract Task HandleAsync(T eventType);
private void HandleNonAsync(T eventType)
{
HandleAsync(eventType).GetAwaiter().GetResult();
}
private Action<object> Convert(Action<T> myActionT)
{
if (myActionT == null) return null;
else return new Action<object>(o => myActionT((T)o));
}
}
推荐阅读
- ruby-on-rails - Rails 从可用性中选择日期
- python-3.x - 类变量(不是实例变量)是具有相同类类型的对象的快捷方式?
- wordpress - 使用 wp_query 和通过 URL 发送的值为自定义帖子元正确配置 Wordpress 搜索过滤器
- javascript - 使用猫鼬添加不在模式中的字段
- microsoft-cognitive - Azure Cognitiveservices 计算机视觉 Java SDK 的源代码
- c# - 在运行时动态选择命名空间和类
- c# - 如何在实时图表中创建垂直线
- python - 在字符串中查找多个略有不同的子字符串
- nltk - 在 Python 中识别 Stanford Tregex 中的模式
- mysql - fail2ban 添加 PHP 函数