我有这样的方法:
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);
为什么会这样?
这里的问题是我在这里“迷失”了具体事件。当我将该类型参数传递给next方法(没有事件实例)时,我只输入“IEvent”....
答案 0 :(得分:2)
实际上这很有意义。
当您说DomainEvents.Raise(evt)
时,evt
的类型在编译时已知为IEvent
,因此编译器会推断出类型并将其写为DomainEvents.Raise<IEvent>(evt)
答案 1 :(得分:1)
使用运行时类型定义(dynamic
类型),否则通用参数类型将为IEvent
(在编译时从参数类型推断):
foreach (IEvent evt in entity.UncommittedEvents)
{
DomainEvents.Raise((dynamic)evt);
}
答案 2 :(得分:0)
FYI ... 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);
}
}
}
}