我需要创建一个通用的IList,其中T将是具有各种接口的泛型类。
例如ChannelFactory<IService1>
或ChannelFactory<IService2>
等等。
答案 0 :(得分:7)
如果您需要,您应该在必要时更改您的设计。使所有接口派生自相同的接口,例如IServiceBase
。然后,您可以在泛型类上使用以下约束:
IList<T> where T: IServiceBase
答案 1 :(得分:1)
这个怎么样?
public class MyList<T>: IList<T> where T: class
{
}
答案 2 :(得分:1)
你可以这样做:
IList<ChannelFactory<IService1>> list = new List<ChannelFactory<IService1>>;
但是你不能混合和匹配ChannelFactory&lt; IService1&gt;和ChannelFactory&lt; IService2&gt;此列表中的对象。
如果真的需要在列表中混合和匹配,请使用非通用的:
IList non_generic_list = new List();
non_generic_list.Add(new ChannelFactory<IService1>());
non_generic_list.Add(new ChannelFactory<IService2>());
答案 3 :(得分: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>>;
如果您知道何时何地需要哪个泛型类,请转到接口层次结构。如果您没有完全控制它,但需要在运行时动态创建列表,这可能是一个解决方案。
答案 4 :(得分:0)
你可以这样做:
var list = new List<ChannelFactory<IService1>>();
事实上,您可以根据需要嵌套泛型,但一段时间后您可能会厌倦所有尖括号。