2

私はこのような方法を持っています:

public static void Raise<TEvent>(TEvent eventToRaise)
    where TEvent : IEvent
{
}

そして、私はそのメソッドを次のように呼び出します。

foreach (IEvent evt in entity.UncommittedEvents)
{
    DomainEvents.Raise(evt);
}

ここで、これは正しいと思います。

bool areSame = typeof(TEvent) == eventToRaise.GetType();

しかし、それは真実ではないようです。代わりにそれは:

bool areSame = typeof(TEvent) == typeof(IEvent);

どうしてこんなことに?

ここでの問題は、私がここで具体的なイベントのタイプを「失った」ことです。その型パラメーターを次のメソッドに渡すと(イベントのインスタンスなしで)、型は「IEvent」だけになります。

4

3 に答える 3

2

実際、それは理にかなっています。

と言うとDomainEvents.Raise(evt)、の型はevtコンパイル時にであることがわかっているIEventので、コンパイラは型を推測し、それをとして書き込みますDomainEvents.Raise<IEvent>(evt)

于 2012-12-09T09:17:22.103 に答える
1

実行時型定義(dynamictype)を使用します。そうでない場合、汎用パラメーター型はIEvent(コンパイル時にパラメーター型から推測されます):

foreach (IEvent evt in entity.UncommittedEvents)
{
    DomainEvents.Raise((dynamic)evt);
}
于 2012-12-09T09:17:09.000 に答える
0

参考までに...lazyberezovskyの答えは機能する解決策でしたが、動的キャストを使用するには呼び出し元のコードが知っている必要があるという問題があるようです。そのため、最終的に次のような解決策になりました。

public static void Raise<TEvent>(TEvent eventToRaise)
    where TEvent : IEvent
{
    if (eventToRaise == null)
    {
        throw new ArgumentNullException("eventToRaise");
    }

    if (typeof(TEvent) == typeof(IEvent))
    {
        DomainEvents.Raise((dynamic)eventToRaise);
    }
    else
    {
        foreach (IDomainEventHandlerProvider provider in DomainEvents.eventHandlerProviders)
        {
            foreach (IEventHandler<TEvent> handler in provider.GetHandlers<TEvent>())
            {
                handler.Handle(eventToRaise);
            }
        }
    }
}
于 2012-12-30T16:25:26.097 に答える