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

如何在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它自己IHandleHandle()

认为我有只有一个街区,在我的脑海里,因为我试图解决这一点,因为小时,由于这样的事实,我的最佳途径越来越疯狂。

感谢您的帮助!

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

可能的解决方法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属性,但也不是我正在寻找的解决方案。

+0

你需要提供通用的参数'IHandle ''中实现MyViewModel'时候?如果没有,为什么不简单地执行'IHandler >'? – kuskmen

+0

感谢您的回答,但我无法使viewmodel本身具有通用性。我只是希望处理的消息是通用的,我尽量避免为每个设置一个方法。 – Matthias

我认为你正在寻找这些要求:

1)你需要一个消息给定类型,像“人消息”

2)你需要给定类型的处理程序和它的消息,比如“的人处理”

您可以编写界面是这样的:

public interface IHandle<T> 
{ 
    void Handle(IMessage<T> message); 
} 
public interface IMessage<T> 
{ 
    T Payload { get; set; } 
} 
+0

感谢您的回复。但我需要一个通用消息的处理程序。我更新了问题以更好地描述问题。 – Matthias

+0

但是这个处理程序已经用于通用消息(类型为“T”)。这个解决方案没有捕获你的什么需求? – larsbe

+0

不,处理程序是针对“消息”而不是“T”类型的。 “IHandle”接口由Caliburn.Micro定义。你的两个假设都不是我想要做的事情。所以我给我的问题添加了新的信息。感谢您的回复!我要求该方法过于通用,我应该可以在不指定ViewModel中的'T'的情况下处理'Message '。 – Matthias

请检查;

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>(); 
+0

感谢您的回复,但这并不能解决问题。 'IHandle'由Caliburn.Micro定义,处理程序应处理'消息'而不是'T'。 – Matthias