我有如下界面
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>
toListener<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/