是否可以定义实现多个接口的任何类型的列表?

Ste*_*ven 15 c# generics

考虑以下类层次结构:

public interface X { void Foo(); }

public interface Y { void Bar(); }

public class A : X, Y
{
    public void Foo() {}
    public void Bar() {}
}

public class B : X, Y
{
    public void Foo() {}
    public void Bar() {}
}
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以定义一个列表(或任何通用类型),它可以包含A's和B's',同时允许我将所述列表的内容视为两者XY?也就是说,这将允许我写下这样的内容:

var list = ???
list.Add(new A());
list.Add(new B());
list.First().Foo();
list.Last().Bar();
Run Code Online (Sandbox Code Playgroud)

编辑

只是为了澄清,我目前正在处理的类型是ObservableCollection<T>(A)和ReadOnlyObservableCollection<T>(B),我感兴趣的接口是IList<T>(X)和INotifyCollectionChanged(Y).很明显,我无法改变他们的类层次结构来满足我的需求,所以我需要一个不同的解决方法.

Mar*_*zek 15

不,除非您声明另一个界面:

IAB : IA, IB {}
Run Code Online (Sandbox Code Playgroud)

并让两个类实现它.

你也可以实现自己的集合类,这样List<IFirst, ISecond>就可以了.

  • 您不必更改类.您可以围绕它们创建包装类. (4认同)

Eri*_*ric 6

您可能不希望修改A类和B类,因此包装器可以完成这项工作

public class XYWrapper : X, Y
{

  private dynamic InternalObject { get; set; }

  public void Foo() { InternalObject.Foo(); }
  public void Bar() { InternalObject.Bar(); }

  public static implicit operator XYWrapper(A value)
  {
    var instance = new XYWrapper();
    instance.InternalObject = value;
    return instance;
  }

  public static implicit operator XYWrapper(B value)
  {
    var instance = new XYWrapper();
    instance.InternalObject = value;
    return instance;
  }
}
Run Code Online (Sandbox Code Playgroud)

所以你用这种方式使用它:

var list = new List<XYWrapper>();
list.Add(new A());
list.Add(new B());
list.First().Foo();
list.Last().Bar();
Run Code Online (Sandbox Code Playgroud)