2009-12-22 37 views
0

我需要創建一個通用IList,其中T將是一個具有各種接口的泛型類。 例如ChannelFactory<IService1>ChannelFactory<IService2>等。IList <T>其中T是通用類

+2

這裏有問題嗎? – leppie 2009-12-22 09:20:29

+1

我想他想要一個接受帶有接口類型約束的多個接口的泛型類。 – 2009-12-22 09:21:44

回答

7

如果你想這樣做,你應該改變你的設計,如果有必要。使所有接口都來自相同的接口,例如IServiceBase。然後,可以使用以下約束你的泛型類:

IList<T> where T: IServiceBase 
+0

界面層次結構是確定的方式。 – Codesleuth 2009-12-22 09:22:48

1

這是怎麼回事?

public class MyList<T>: IList<T> where T: class 
{ 
} 
1

你可以這樣做:

IList<ChannelFactory<IService1>> list = new List<ChannelFactory<IService1>>; 

但你不能混用,並在本場比賽的ChannelFactory < IService1>和的ChannelFactory < IService2>對象名單。

如果你真的需要混合和匹配列表中使用非通用的一個:

IList non_generic_list = new List(); 
non_generic_list.Add(new ChannelFactory<IService1>()); 
non_generic_list.Add(new ChannelFactory<IService2>()); 
0

你可以只是這樣做:

var list = new List<ChannelFactory<IService1>>(); 

事實上,你可以嵌套泛型儘可能多的,但你可能會在一段時間後對所有尖括號感到厭倦。

1

如果您需要在運行時從動態類型創建列表,則可以像這樣創建通用列表類型。

public IList CreateList(Type interfaceType) 
     { 
      return (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(interfaceType)); 
     } 

然後,你可以這樣做:

IList<ChannelFactory<IService1>> list = CreateList(typeof(ChannelFactory<IService1>)) as IList<ChannelFactory<IService1>>; 

如果你有知識,通用類的,你需要的時間和地點,去的接口層次結構。如果您沒有完全控制它,但需要在運行時動態創建列表,這可能是一個解決方案。