如何在caliburn.micro的IHandle <>中使用genenric类作为参数?
我试图让以下的事情没有成功。 :-(我想使用一个通用类作为IHandle<>
接口参数下面是示例代码:如何在caliburn.micro的IHandle <>中使用genenric类作为参数?
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
的typesafty。可以添加一个TypeOfPayload
属性,但也不是我正在寻找的解决方案。
我认为你正在寻找这些要求:
1)你需要一个消息给定类型,像“人消息”
2)你需要给定类型的处理程序和它的消息,比如“的人处理”
您可以编写界面是这样的:
public interface IHandle<T>
{
void Handle(IMessage<T> message);
}
public interface IMessage<T>
{
T Payload { get; set; }
}
请检查;
interface IHandle<T>
{
T Handle { get; set; }
}
public interface Message<T>
{
T Payload { get; set; }
}
public class MyViewModel <T>: IHandle<T>
{
public T Handle { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
}
,如果你需要创建MyViewModel的实例:
MyViewModel<YourClassName> model=new MyViewModel<YourClassName>();
感谢您的回复,但这并不能解决问题。 'IHandle'由Caliburn.Micro定义,处理程序应处理'消息
你需要提供通用的参数'IHandle ''中实现MyViewModel'时候?如果没有,为什么不简单地执行'IHandler>'? –
kuskmen
感谢您的回答,但我无法使viewmodel本身具有通用性。我只是希望处理的消息是通用的,我尽量避免为每个设置一个方法。 –
Matthias