【发布时间】:2017-08-10 11:19:04
【问题描述】:
我试图让以下事情没有成功。 :-( 我想使用泛型类作为IHandle<> 接口的参数。这是示例代码:
public interface Message<T>
{
T Payload { get; set; }
}
...
public MyViewModel : Screen, IHandle<IMessage<T>>
{
...
public void Handle(IMessage<T> message)
{
....
}
}
问题是:如何正确声明IHandle?还是我需要为每个T 指定它自己的IHandle 和Handle()?
我想我脑子里只有一个障碍,因为我几个小时以来一直在尝试解决这个问题,而且因为我正以最好的方式变得疯狂。
感谢您的帮助!
更新:为了展示我想要做什么,我添加了两个可能但不是很好的解决方案。
可能的解决方案1:
public MyViewModel : Screen, IHandle<IMessage<String>>, IHandle<IMessage<Int32>>
等等。问题在于,当应该支持新的T 时,我总是需要编辑 ViewModel。在这种情况下,我可以跳过通用的 IMessage 并创建特定的消息(如 IStringMessage、IInt32Message),这将使代码更具可读性,但会将其与使用的每种类型结合起来。
可能的解决方案2:
public MyViewModel : Screen, IHandle<IMessage>
并将IMessage 更改为:
public interface IMessage
{
Object Payload { get; set; }
}
这可以完成这项工作,但我失去了Payload 的类型安全性。可以添加可选的 TypeOfPayload 属性,但也不是我正在寻找的解决方案。
【问题讨论】:
-
在
MyViewModel中实现时是否需要给IHandle<>提供泛型参数?如果没有,为什么不干脆做IHandler<Message<ConcreteType>>? -
感谢您到目前为止的回答,但我无法使视图模型本身具有通用性。我只想将消息处理为通用的,并且我尽量避免为每个
设置一个方法。
标签: c# caliburn.micro