通用类型参数与参数实例的类型不同

时间:2012-12-09 09:13:56

标签: c# generics domain-driven-design

我有这样的方法:

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”....

3 个答案:

答案 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);
            }
        }
    }
}