一个List <t> </t>中包含多个接口

时间:2011-04-19 13:05:52

标签: c# generics inheritance interface generic-list

有没有办法在像List这样的泛型类中定义类型,以包含仅实现多个接口的对象?可能是类型接口。

例如:

List<myObjectBase, IDisposable, IClonable> myList;

6 个答案:

答案 0 :(得分:8)

不确定我是否理解正确,但是如何:

class MyList<T> : List<T>
  where T : myObjectBase, IDisposable, IClonable
{
}

这样,您只能将对象添加到从基础派生的列表中并实现这些接口。

答案 1 :(得分:1)

没有。在这种情况下,您必须以下列方式表达:

public class CommonStuff : MyObjectBase, IDisposable, IClonable {}

然后你可以写:

List<CommonStuff> myList;

答案 2 :(得分:1)

不,不支持多个通用参数。

它也没有多大意义。使用泛型List<T>类比ArrayList之类的东西没有任何好处。你将失去所有类型的安全利益,你最终仍然需要把东西扔到那个地方。

更好的选择是创建一个复合类来处理你想要做的所有事情......然后使用它:

public class CommonBase : MyBaseClass, ICloneable, IDisposable
{
}

然后将其用作通用参数:

var newList = new List<CommonBase>();

答案 3 :(得分:1)

以下是添加多个适合我的界面的最简单解决方案。

列表与LT; ICommonInterface&GT; myList = new List&lt; ICommonInterface&gt;()

myFirstClass m1C = new myFirstClass();
mySecondClass m2C = new mySecondClass();

myList.Add(m1C);
myList.Add(m2C);

foreach (var item in myList)
{
    item.Clone();
    item.Dispose();
}

class myFirstClass : ICommonInterface  
{  
// implement interface methods  
}  

class mySecondClass : ICommonInterface  
{  
// implement interface methods  
}  


interface ICommonInterface : IDisposable, IClonable  
{  
}  


interface IDisposable  
{  
    void Dispose(){}  
}  

interface IClonable     
{  
    void Clone(){}  
}  

答案 4 :(得分:1)

可能有用的一种方法是定义接口ISelf&lt; out T&gt;其中一个成员Self,简单地将“this”作为T返回;那么对于任何接口我可以组合什么,定义一个通用版本IWhatever&lt; out T&gt;它继承了IWhatever和ISelf&lt; T&gt;。在这种情况下,实现IFoo&lt; Whizbang&gt;的Whizbang类。和IBar&lt; Whizbang&gt;将隐含地实现ISelf&lt; Whizbang&gt;,IFoo&lt; IBar&lt; Whizbang&gt;&gt;,IBar&lt; IFoo&lt; Whizbang&gt;&gt;等。需要实现IFoo和IBar的例程的例程可以接受IFoo&lt; IBar&gt;类型的参数;该参数将实现IFoo;它的Self属性将实现IBar。使用此模式实现多个接口的任何对象都可以使用按任何顺序列出的部分或全部接口强制转换为给定表单的嵌套接口类型。

答案 5 :(得分:0)

您可以使用ArrayList并可以检查此列表中对象的类型 - 可能更方便。

if(list[i] is Type)