C# 考虑到逆差,制定统一解决方案
我想将unity用于多态事件聚合/处理,其中处理程序是通过容器注册的 处理程序使用“in”修饰符声明泛型参数,因为它仅用作输入参数。所以参数是逆变的 考虑以下示例C# 考虑到逆差,制定统一解决方案,c#,polymorphism,unity-container,contravariance,C#,Polymorphism,Unity Container,Contravariance,我想将unity用于多态事件聚合/处理,其中处理程序是通过容器注册的 处理程序使用“in”修饰符声明泛型参数,因为它仅用作输入参数。所以参数是逆变的 考虑以下示例 接口IHandler{void Handle(T message);} 接口IMsg{string Message{get;}} 类MsgA:IMsg{…} 类MsgB:IMsg{…} 类MsgAHandler:IHandler{ 公共无效句柄(MsgA msg){…} } 类MsgBHandler:IHandler{ 公共无效句柄(
接口IHandler{void Handle(T message);}
接口IMsg{string Message{get;}}
类MsgA:IMsg{…}
类MsgB:IMsg{…}
类MsgAHandler:IHandler{
公共无效句柄(MsgA msg){…}
}
类MsgBHandler:IHandler{
公共无效句柄(MsgB msg){…}
}
MsgHandler类:IHandler{
公共无效句柄(IMsg msg){…}
}
类ObjectHandler:IHandler{
公共无效句柄(对象消息){…}
}
班级活动{
公共无效发布(T消息){
//实际上,这段代码对于Unity来说更复杂,因为它首先尝试
//使用.resolve()解析默认注册的组件,
//然后使用.ResolveAll()解析所有命名组件
foreach(此.container.ResolveAll()中的var处理程序){
handler.Handle(消息);
}
}
}
我的期望如下:
- 如果我收到
,我应该将其发送到MsgA
、MsgAHandler
和MsgHandler
ObjectHandler
- 如果我收到
,我应该将其发送到IMsg
和MsgHandler
ObjectHandler
应接收所有消息ObjectHandler
Resolve()
也匹配实现IHandle
或IHandle
的任何类型
我使用UnityExtensions(匹配规则、策略等)查找示例,但没有成功
有人能告诉我如何使用正确的机制来实现这样的场景吗?您能做到:
container.RegisterType(typeof(IHandle<>), typeof(MsgAHandler<>))
container.RegisterType(typeof(IHandle),typeof(MsgAHandler))
但是您可能需要更改一些代码才能正常工作。比如:
public interface IHandler<in THandler> where THandler : class, IMsg
{ void Handle(THandler message); }
公共接口IHandler,其中THandler:class,IMsg
{无效句柄(THandler消息);}