IList <t>其中T是泛型类</t>

时间:2009-12-22 09:17:06

标签: c# .net generics

我需要创建一个通用的IList,其中T将是具有各种接口的泛型类。 例如ChannelFactory<IService1>ChannelFactory<IService2>等等。

5 个答案:

答案 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>>();

事实上,您可以根据需要嵌套泛型,但一段时间后您可能会厌倦所有尖括号。