0

次のクラスがあります (一部は PRISM フレームワークにあり、変更できません)。

public abstract class NetworkEventBase<T> : CompositePresentationEvent<T> where T : NetworkEventPayload { }
public class NetworkEventPayload { }
public class TestEvent : NetworkEventBase<TestPayload> { }
public class TestPayload : NetworkEventPayload { }

// the following classes are PRISM classes:
public class CompositePresentationEvent<TPayload> : EventBase { }
public abstract class EventBase { }

ここで、TestEvent のインスタンスを、IEventAggregator のデコレータ内の基本クラス NetworkEventBase に変換する必要があります。IEventAggregator は次のようになります。

public interface IEventAggregator
{
    TEventType GetEvent<TEventType>() where 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;
    }
}

ただし、aggregatedEvent のランタイム タイプが TestEvent であっても、networkEvent は常に null です。

4

1 に答える 1

1

呼び出されたクラスNetworkEventBase<T>が で共変であることを望んでいるようですT。ただし、C# ではジェネリック クラスを共変にすることはできません (ジェネリック インターフェイスは可能です)。

この問題に関する他のスレッドを参照してください。

于 2013-07-18T08:15:08.290 に答える