首页 > 解决方案 > 如何实现非泛型接口并使用泛型调用

问题描述

可能是一个糟糕的标题,但我试图从我的通用处理程序类中抽象出类型“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);
}

谢谢您的帮助!

标签: c#genericsinheritance

解决方案


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));
    }
}

推荐阅读