使事件有效负载成为通用对象

时间:2012-08-03 20:20:47

标签: c# .net generics prism

我有这样的代码:

public class TabActivationRequestEvent<T> : 
             CompositePresentationEvent<TabActivationRequest<T>>{}

public class TabActivationRequest<T>  
{
    public IOMStudioTab OMStudioTab { get; set; }
    public T RegionData { get; set; }
}

public void RequestTabActivation<T>(TabActivationRequest<T> tabActivationRequest)
{
    var prismEvent = eventAggregator.GetEvent<TabActivationRequestEvent<T>>();
    prismEvent.Publish(tabActivationRequest);
}

我用它来发送一个Prism事件(通过事件聚合器)。

然而,当我去订阅时,我遇到了问题。这就是我试图做的事情:

void OtherClassCtor()
{    
     var tabFocusEvent = eventAggregator.GetEvent<TabActivationRequest<T>>();
     tabFocusEvent.Subscribe(OnTabFocusRequest, true);                 ^
}                                                                      |
                                                                       |
private void OnTabFocusRequest<T>(TabActivationRequest<T> regionData)  |
{                                                                      |
     // do stuff here                                                  |
}                                                                      |
                                                                       |
This part Fails -------------------------------------------------------+

编译器说我不能在那里使用类型参数。当我退后一步看它时,它是有道理的。 (当前类对任何类型参数都一无所知)。

但是定义类型对我来说是一个交易破坏者,所以我只想使用object

但是这让我想知道是否有任何类似的花哨编码可以让我通过事件系统传递泛型类型。

如果您知道任何事情,请发布。如果没有,我会对我的object和我的演员感到满意。

2 个答案:

答案 0 :(得分:1)

正如您所说,它不起作用,因为OtherClass本身没有通用类型参数可供TabActivationRequest使用。

明显的解决方案是使OtherClass通用。否则,您可以使用反射来调用GetEvent方法。查看MakeGenericMethod类型的MethodInfo - MSDN包含一些有用的hints and an example。当然,您仍然需要以某种方式获得要使用。{/ p>调用GetEvent的类型

答案 1 :(得分:0)

您需要将OtherClassCtor类设为通用类,或者在GetEvent调用中为通用TabActivationRequest提供类型。