我试着让以下事情没有成功。 :-(我想使用泛型类作为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()
指定每个public MyViewModel : Screen, IHandle<IMessage<String>>, IHandle<IMessage<Int32>>
?
我认为自从我尝试解决这个问题以来我只有一个障碍,因为我在最好的方式疯狂。
感谢您的帮助!
更新:为了展示我想做的事情,我添加了两个可能但不是很好的解决方案。
可能的解决方案1:
T
等等。这个问题是,当需要支持新的IMessage
时,我总是需要编辑ViewModel。在这种情况下,我可以跳过通用IStringMessage
并创建特定消息(如IInt32Message
,public MyViewModel : Screen, IHandle<IMessage>
),这将使代码更具可读性,但将其与所使用的每种类型相结合。
可能的解决方案2:
IMessage
并将public interface IMessage
{
Object Payload { get; set; }
}
更改为:
Payload
这可以完成这项工作,但我放弃了TypeOfPayload
的类型。可以添加5000 - 10000 is 20%
10000 - 20000 is 25%
20000 - above is 35%
属性,但也不是我正在寻找的解决方案。
答案 0 :(得分:0)
我认为你正在寻找这些要求:
1)您需要一个给定类型的消息,例如“人的消息”
2)您需要一个给定类型及其消息的处理程序,如“人员处理程序”
您可以像这样编写接口:
public interface IHandle<T>
{
void Handle(IMessage<T> message);
}
public interface IMessage<T>
{
T Payload { get; set; }
}
答案 1 :(得分:0)
请检查;
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>();