如何在IHandle<>中使用genenric类作为参数来自caliburn.micro?

时间:2017-08-10 11:19:05

标签: c# caliburn.micro

我试着让以下事情没有成功。 :-(我想使用泛型类作为IHandle<>接口的参数。以下是示例代码:

public interface Message<T>
{ 
    T Payload { get; set; }
}

...

public MyViewModel : Screen, IHandle<IMessage<T>>
{
    ...
    public void Handle(IMessage<T> message)
    {
        ....
    }
}

问题是:如何以正确的方式声明IHandle?或者我是否需要为每个T IHandleHandle()指定每个public MyViewModel : Screen, IHandle<IMessage<String>>, IHandle<IMessage<Int32>>

我认为自从我尝试解决这个问题以来我只有一个障碍,因为我在最好的方式疯狂。

感谢您的帮助!

更新:为了展示我想做的事情,我添加了两个可能但不是很好的解决方案。

可能的解决方案1:

T

等等。这个问题是,当需要支持新的IMessage时,我总是需要编辑ViewModel。在这种情况下,我可以跳过通用IStringMessage并创建特定消息(如IInt32Messagepublic 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% 属性,但也不是我正在寻找的解决方案。

2 个答案:

答案 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>();