2013-04-01 91 views
2

我想要一個IEnumerable<Action<T>> subscriptions這是一個動作數組,每個具有不同的類型參數 - 我想傳遞一個列表到一個服務構造函數來循環這些並註冊,但編譯器抱怨(不出所料)。從基類型的行動泛型

是否有任何方法可以實現傳遞基類型的能力,該類型具有派生的特定實現,並遍歷該列表?

class InternalBusService 
{ 
    private InternalBus bus; 

    public InternalBusService(IEnumerable<Action<T>> subscriptions) 
    { 
     foreach (var subscription in subscriptions) 
     { 
      this.bus.Subscribe<T>(subscription); 
     } 
    } 
} 
+1

需要更多關於'InternalBus'的信息。你可以向我們展示'Subscribe'方法嗎? – JaredPar

+0

InternalBusService構造函數需要成爲InstructorBusService 以在其內部利用T. – dwerner

+0

你在訂閱什麼?當*訂閱*(按照您的名稱命名)委託調用時,它不會發生在您身上。 –

回答

2

如果我明白你想通過IEnumerable<Action<T>>其中對於枚舉中每個動作的T不是相同的類型,這是不可能的。也許你可以在下面做這樣的「概念代碼」(這意味着它只是爲了向你展示我在想什麼,它不一定是一種解決方案)。

public interface IActionWrapper 
{ 

    bool AcceptsParameterType(Type t); 
    void PerformAction(object o); 
} 

public class ActionWrapper<T> : IActionWrapper 
{ 
    Action<T> yourAction {get;set;} 

    public bool AcceptsParameterType(Type t) 
{ 
return t is T; 
} 

public void PerformAction(object o) 
{ 
    yourAction((T)o); 
} 

} 

然後,你可以通過IEnumerable<IActionWrapper>>到您的函數,而不是通用的類型化和將其實現支持多種類型。

2

你的意思是這樣嗎?

class InternalBusService<T> 
    where T : SomeType 
{ 
    public InternalBusService(IEnumerable<Action<T>> subscriptions) 
    { 
     foreach (var subscription in subscriptions) 
     { 
      this.bus.Subscribe<T>(subscription); 
     } 
    } 
} 

where T : SomeType可以是要限制T任何類型。

+0

嗨,看起來這個答案不像OP所說的那樣。 –

0

爲了解決編譯器錯誤:

class InternalBusService<T> 
{ 
    public InternalBusService(IEnumerable<Action<T>> subscriptions) { } 
} 

,但不知道它是你要真正實現什麼。