我经常想要创建一个对象列表,其中每个对象必须实现许多接口。例如,我想做类似以下的事情:
List<T> where T : IConvertible, IComparable _myList;
我考虑的另一个选择是创建一个实现这两个接口的第三个接口,以便实现这两个接口的任何对象本身都实现了我的。
public interface IConvertibleAndComparable
: IConvertible, IComparable { }
List<IConvertibleAndComparable> _myList;
通过这个,我可以添加任何实现IConvertible
和IComparable
的对象,包括double
和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
未明确声明时新功能)。
答案 0 :(得分:5)
作为一种解决方法,您可以执行一种叠加包装,并将其存储在列表中。看看here的想法。
您可以这样做:
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
};
}
}
然后将Junction
添加到您的列表中:
var l = new List<Junction>();
l.Add(Junction.Create(1));
答案 1 :(得分:0)
在处理另一个项目时,我想到了另一个解决方法。虽然它可能不适用于我发布的示例,但它可以用于问题的原始意图,即为IEnumerable<T>
和INotifyCollectionChanged
创建组合界面(正如@DanielHilgarth指出的那样)。解决方法如下:
创建一个空接口,实现所需接口的组合。
public interface INotifyingEnumerable<T> :
IEnumerable<T>,
INotifyCollectionChanged
{
}
创建一个新类,该类继承自实现这两者的类并实现新接口。
public class MyObservableCollection<T> :
ObservableCollection<T>,
INotifyingEnumerable<T>
{
}
现在您可以使用接口INotifyingEnumerable<T>
作为属性类型,使用您的实现。
然而,这并不完全涵盖原始要求的原因是它不允许直接分配ObservableCollection<T>
。原帖中要求的功能允许这样做。