Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 泛型方法中的泛型类型转换_C#_Prism 4 - Fatal编程技术网

C# 泛型方法中的泛型类型转换

C# 泛型方法中的泛型类型转换,c#,prism-4,C#,Prism 4,我有以下类(其中一些在PRISM框架中,无法更改): 公共抽象类NetworkEventBase:CompositePresentationEvent其中T:NetworkEventPayload{} 公共类NetworkEventPayload{} 公共类TestEvent:NetworkEventBase{} 公共类TestPayload:NetworkEventPayload{} //以下类别为棱镜类别: 公共类CompositePresentationEvent:EventBase{}

我有以下类(其中一些在PRISM框架中,无法更改):

公共抽象类NetworkEventBase:CompositePresentationEvent其中T:NetworkEventPayload{}
公共类NetworkEventPayload{}
公共类TestEvent:NetworkEventBase{}
公共类TestPayload:NetworkEventPayload{}
//以下类别为棱镜类别:
公共类CompositePresentationEvent:EventBase{}
公共抽象类EventBase{}
现在,我需要将TestEvent的一个实例转换为它的基类NetworkEventBase,它位于IEventAggregator的装饰器中。IEventAggregator看起来像:

public interface IEventAggregator
{
    TEventType GetEvent<TEventType>() where TEventType : EventBase, new();
}
公共接口IEventAggregator
{
TEventType GetEvent(),其中TEventType:EventBase,new();
}
现在,在我的装饰器中,我尝试如下转换:

public class MessageBusAdapterInjectorDecorator : IEventAggregator {
    ...

    public TEventType GetEvent<TEventType>() where TEventType : EventBase, new()
    {
        var aggregatedEvent = this.eventAggregator.GetEvent<TEventType>();
        var networkEvent = aggregatedEvent as NetworkEventBase<NetworkEventPayload>;

        if (networkEvent != null)
        {
            networkEvent.MessageBusAdapter = this.messageBusAdapter;
        }

        return aggregatedEvent;
    }
}
公共类MessageBusAdapterInjectorDecorator:IEventAggregator{
...
public TEventType GetEvent(),其中TEventType:EventBase,new()
{
var aggregatedEvent=this.eventAggregator.GetEvent();
var networkEvent=aggregatedEvent作为NetworkEventBase;
if(networkEvent!=null)
{
networkEvent.MessageBusAdapter=this.MessageBusAdapter;
}
返回聚合事件;
}
}

但是,即使aggregatedEvent的运行时类型为TestEvent,networkEvent始终为空。

您似乎希望称为
NetworkEventBase
类在
T
中是协变的。但是泛型类在C#中不能是协变的(泛型接口可以)


有关此问题,请参阅其他帖子。

请编辑示例,以便清楚地了解
networkEvent
的来源。NSA已经发布了PRISM的框架?谢谢,我现在创建了一个接口,它定义了将IMessageBusAdapter注入事件的方法。
public class MessageBusAdapterInjectorDecorator : IEventAggregator {
    ...

    public TEventType GetEvent<TEventType>() where TEventType : EventBase, new()
    {
        var aggregatedEvent = this.eventAggregator.GetEvent<TEventType>();
        var networkEvent = aggregatedEvent as NetworkEventBase<NetworkEventPayload>;

        if (networkEvent != null)
        {
            networkEvent.MessageBusAdapter = this.messageBusAdapter;
        }

        return aggregatedEvent;
    }
}