2013-04-17 26 views
1

比方說叫InterfaceMethods,我有一個通用的接口如何從通用接口

IWhatEver<T> : where T : .... 
{ 
    T DoStuff(object value); 
} 

class Foo : IWhatEver<string> {...} 
class Bar: IWhatEver<double> {...} 

該接口由幾類實現的。

如何將此接口的實例存儲在列表中以及如何調用DoStuff函數?

事情是這樣的:

List<IWhatEver<????>> whatEvers = new List<IWhatEver<????>>(); // doesnt work... 

whatEvers.Add(new Foo()); 
whatEvers.Add(new Bar()); 


var whatWillThisBe = whatEvers.Select(w => w.DoStuff(withSomeObject)); 

我相信這心不是甚至可能,但也許我忘了什麼事嗎?

+1

不,這不太可能。您需要從非泛型接口繼承泛型接口,並且會爲您的方法等返回值引入另一個複雜的堆。 =) –

+1

如何使用'dynamic'? – MarcinJuraszek

+0

在上下文中不能使用動態...可悲的是。 – CSharpie

回答

2

一種選擇是創建一個非通用基本接口和繼承通用從中

IWhatEver 
{ 
    object DoStuff(object value); 
} 

IWhatEver<T> : IWhatEver where T : .... 
{ 
    new T DoStuff(object value); 
} 

你也可以有一個基礎抽象類,明確通過調用IWhatEver<T>.DoStuff從IWhatEver和工具IWhatEver.DoStuff繼承。

abstract class BaseWhatEver<T> : IWhatEver<T> 
{ 
    abstract T DoStuff(object value); 

    object IWhatEver.DoStuff(object value) 
    { 
      return ((IWhatEver<T>) this)DoStuff(value); 
    } 
} 
+0

是的,正在考慮這種方法,但我需要將接口添加到現有的類。猜猜我會將它改爲Object並且不使用任何泛型:/ – CSharpie