c# - 如何使用 C# 检查一个类是否实现了泛型并与泛型接口(interface)?

标签 c#

我有如下界面

public interface IHandleSuccess<T> where T : Event
{
    void Finished(T _event, Listener<T> listener);
}

还有下面的类

public abstract class Listener<T> where T : Event
{
    public abstract void Handle(T _event);
}

下面的类扩展了Listener<T>并实现 IHandleSuccess<T>

public class SendConfirmationEmail : Listener<UserWasUpdated>, IHandleSuccess<UserWasUpdated>
{
    public override void Handle(UserWasUpdated _event)
    {
        // ...
    }

    public void Finished(UserWasUpdated _event, Listener<UserWasUpdated> listener)
    {
        // ...
    }
}

最后,另一个扩展 Listener<T> 的监听器但不执行 IHandleSuccess<T>

public class ScheduleOriantation: Listener<UserWasUpdated>
{
    public override void Handle(UserWasUpdated _event)
    {
        // ...
    }
}

我的 SendConfirmationEmail获取类已注册到我的 IoC应用程序启动时的容器。

我想检查解析的实例是否实现了契约。如果是这样,我想调用 Finished方法。

public void Announce<T>(T _event) where T : Event
{
    IEnumerable<Listener<T>> listeners = Container.ResolveAll<Listener<T>>()

    foreach (var listener in listeners)
    {
        try
        {
            listener.Handle(_event);

            if (listener is IHandleSuccess<> _listener)
            {
                _listener.Finished(_event, listener);
            }
        }
        catch (Exception e)
        {
            // ...
        }
    }
}

但是,IHandleSuccess<> 行给我一个错误

Unexpected use of an unbound generic name

因为通用参数总是会扩展 Event类,我也尝试将代码更改为以下内容

listener.Handle(_event);

if (listener is IHandleSuccess<Event> _listener)
{
    _listener.Finished(_event, listener);
}

但是_listener.Finished(_event, listener)给我以下错误

The second argument cannot convert from Listener<T> to Listener<Event>

如何正确修复此错误?

最佳答案

你已经知道IHandleSuccess<>的泛型是什么了会的,会的T因为你声明你会收到 Listener<T>来自请求。

public void Announce<T>(T _event) where T : Event
{
    IEnumerable<Listener<T>> listeners = Container.ResolveAll<Listener<T>>()

    foreach (var listener in listeners)
    {
        try
        {
            listener.Handle(_event);

            if (listener is IHandleSuccess<T> _listener)
            {
                _listener.Finished(_event, listener);
            }
        }
        catch (Exception e)
        {
            // ...
        }
    }
}

这是一个 Announce 不是通用的例子

public void Announce(Foo _event)
{
    IEnumerable<Listener<Foo>> listeners = Container.ResolveAll<Listener<Foo>>()

    foreach (var listener in listeners)
    {
        try
        {
            listener.Handle(_event);

            if (listener is IHandleSuccess<Foo> _listener)
            {
                _listener.Finished(_event, listener);
            }
        }
        catch (Exception e)
        {
            // ...
        }
    }
}

关于c# - 如何使用 C# 检查一个类是否实现了泛型并与泛型接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52888279/

相关文章:

c# - 使用MSMQ的并行Foreach

c# - 激活 Storyboard所需的丑陋 C# WPF 代码

c# - 将 Azure 托管标识用于应用服务而不授权新 SDK

c# - 使用 c# 编码通过 asp.net 发送电子邮件?

c# - 如何使用 JSON.NET 解析带有十六进制编码字符的格式错误的 JSONP?

c# - Mac 上 .NET Core 中的 Thread.Sleep()

c# - 单元测试 NotifyPropertyChanged()

c# - 在数据访问项目中使用 web.config 连接字符串

c# - 如何判断 Task 是否为 "observed"?

c# - 显示每个请求的所有 linq sql 查询