【问题标题】:How to use genenric class as parameter in IHandle<> from caliburn.micro?如何在 caliburn.micro 的 IHandle<> 中使用泛型类作为参数?
【发布时间】:2017-08-10 11:19:04
【问题描述】:

我试图让以下事情没有成功。 :-( 我想使用泛型类作为IHandle&lt;&gt; 接口的参数。这是示例代码:

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 并创建特定的消息(如 IStringMessageIInt32Message),这将使代码更具可读性,但会将其与使用的每种类型结合起来。

可能的解决方案2:

public MyViewModel : Screen, IHandle<IMessage>

并将IMessage 更改为:

public interface IMessage
{ 
    Object Payload { get; set; }
}

这可以完成这项工作,但我失去了Payload 的类型安全性。可以添加可选的 TypeOfPayload 属性,但也不是我正在寻找的解决方案。

【问题讨论】:

  • MyViewModel中实现时是否需要给IHandle&lt;&gt;提供泛型参数?如果没有,为什么不干脆做IHandler&lt;Message&lt;ConcreteType&gt;&gt;
  • 感谢您到目前为止的回答,但我无法使视图模型本身具有通用性。我只想将消息处理为通用的,并且我尽量避免为每个 设置一个方法。

标签: c# caliburn.micro


【解决方案1】:

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

1) 您需要给定类型的消息,例如“人的消息”

2) 您需要给定类型及其消息的处理程序,例如“人员处理程序”

你可以这样写接口:

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

【讨论】:

  • 也感谢您的回复。但我需要一个通用消息的处理程序。我更新了问题以更好地描述问题。
  • 但是这个处理程序已经用于通用消息(T 类型)。此解决方案未满足您的哪些需求?
  • 不,处理程序用于Message&lt;T&gt; 类型,而不是TIHandle 接口由 Caliburn.Micro 定义。你的两个假设都不是我想做的事情。所以我在我的问题中添加了新信息。感谢您的回复!我要求该方法过于通用,它应该能够处理 Message&lt;T&gt; 而无需在 ViewModel 中指定 T
【解决方案2】:

请检查;

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 定义,处理程序应处理 Message&lt;T&gt; 而不是 T
猜你喜欢
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多