2012-12-09 90 views
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」....

回答

1

使用運行時類型定義(dynamic類型),否則通用參數類型將爲IEvent(根據參數類型在編譯時):

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

酷,它的工作! – Harza

2

它是有道理的,實際上。

當你說DomainEvents.Raise(evt)evt類型是在編譯時已知IEvent,所以編譯器推斷類型,並將其寫你作爲DomainEvents.Raise<IEvent>(evt)

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