13

我经常想创建一个对象列表,其中每个对象都必须实现多个接口。例如,我想做类似于以下的事情:

List<T> where T : IConvertible, IComparable _myList;

我考虑的另一个选择是创建实现这两个接口的第三个接口,以便实现这两个接口的任何对象固有地实现我的。

public interface IConvertibleAndComparable
    : IConvertible, IComparable { }

List<IConvertibleAndComparable> _myList;

有了这个,我将能够添加任何实现IConvertibleand的对象IComparable,包括doubleand int,以及我自己的对象。不需要显式实现IConvertibleAndComparable,因为它不会在继承接口之外添加任何新功能。

我知道第一个片段是非法的,第二个片段虽然合法,但没有做我想做的事。是否有可能实现我想要做的事情?如果不是,这些中的任何一个都可以成为未来 C# 功能的候选者吗?

(注意:这将是空接口的合法应用程序。)

编辑

在更一般的意义上,我想执行以下操作之一:

private MyGenericClass<T> where T : IA, IB, ... _myClass;

T我可以在哪里声明我需要的所有限制,或者

public interface IMyCombinedInterface : IA, IB, ... {}
private MyGenericClass<IMyCombinedInterface> _myClass;

实现IA,IB...固有(或隐式)实现的任何类型IMyCombinedInterface(仅在IMyCombinedInterface未显式声明新功能时)。

4

2 回答 2

5

作为一种解决方法,您可以做一种叠加包装,并将其存储在列表中。在这里寻找这个想法。

对于您的示例,您可以执行以下操作:

public class Junction
{
    public IConvertible Convertible { get; private set; }
    public IComparable Comparable { get; private set; }
    private Junction() { }
    public static Junction Create<T>(T value) where T : IConvertible, IComparable
    {
        return new Junction
        {
            Convertible = value,
            Comparable = value
        };
    }
}

然后将Junctions 添加到您的列表中:

var l = new List<Junction>();
l.Add(Junction.Create(1));
于 2012-10-17T16:15:49.037 回答
0

在处理另一个项目时,我想到了另一种解决方法。虽然它可能不适用于我发布的示例,但它可能适用于问题的初衷,即为IEnumerable<T>and创建组合界面INotifyCollectionChanged(正如@DanielHilgarth 指出的那样)。解决方法如下:

创建一个空接口,实现您需要的接口组合。

public interface INotifyingEnumerable<T> :
    IEnumerable<T>,
    INotifyCollectionChanged
{
}

创建一个新类,该类继承自实现这两者的类并实现新接口。

public class MyObservableCollection<T> :
    ObservableCollection<T>,
    INotifyingEnumerable<T>
{
}

现在您可以使用接口INotifyingEnumerable<T>作为属性类型,使用您的实现。

然而,这并不能完全涵盖原始要求的原因是它不允许ObservableCollection<T>直接分配。原始帖子中要求的功能将允许这样做。

于 2015-01-20T21:29:19.433 回答