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 回答