1

可以说,我有一个通用接口

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

我相信这甚至是不可能的,但也许我在这里忘记了什么?

4

1 回答 1

2

一种选择是创建一个非泛型基接口并从中继承泛型

IWhatEver 
{
    object DoStuff(object value);
}

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

您还可以有一个基本抽象类,它继承自 IWhatEver 并IWhatEver.DoStuff通过调用显式实现IWhatEver<T>.DoStuff

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

    object IWhatEver.DoStuff(object value)
    {
          return ((IWhatEver<T>) this)DoStuff(value);
    }
}
于 2013-04-17T14:07:53.163 回答