使用reflection创建通用IList实例

我正在尝试使用reflection创建一个通用的对象列表。 以下代码抛出错误无法创建接口的实例。 。 我可以将IList更改为List并且它工作正常,但我想知道是否有办法让这个与IList一起工作。

var name = typeof (IList).AssemblyQualifiedName; Type type = Type.GetType(name); var list = Activator.CreateInstance(type); 

如果你这样做,你必须实例化一个具体的课程

 var type = Type.GetType(typeof (List).AssemblyQualifiedName); var list = (Ilist)Activator.CreateInstance(type); 

你会成功的(只要你提供T的有效值)。

不,不可能创建接口的实例。

.NET(或者说Activator.CreateInstance方法)应该如何决定它应该实例化的接口的哪个实现?

你做不到:

 IList l = new IList(); 

或者,你呢? 您无法实例化接口,因为接口通常是定义或描述类型应实现的function的合同。

Activator.CreateInstance方法调用默认构造函数来创建作为参数传递的类型的实例。 此类型必须是非抽象的而不是接口,并且具有默认构造函数,以便此函数成功。

我不认为你可以使这个工作,因为你不知道你需要创建什么类型的对象。

抽象类会遇到同样的问题。

嗯不,那是不可能的。 错误信息非常清楚。 您无法创建接口的实例。

怎么会知道你想要一个特定类的实例? 通常, 许多类实现相同的接口。 它应该随机挑一个吗? 😉

这与reflection无关,因为您通常也无法“实例化”接口。 仅分配实现接口的对象,然后传递接口引用。

显然,您无法直接实例化IList类型的对象,因为它是一种接口类型。

您应该尝试实现List ,然后将其作为IList

 IList Create() { Type baseListType = typeof(List<>); Type listType = baseListType.MakeGenericType(typeof(T)); return Activator.CreateInstance(listType) as IList; } 

那么,你可以在C#中实现一个接口。 但只有你真的告诉它该怎么做。

请查看http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.coclassattribute.aspx和http://blogs.msdn.com/brada/archive/2004/10/10/240523。 ASPX

但是,在您的情况下,您似乎误解了接口的工作原理。

只需创建一个列表然后返回一个IList ,你的调用代码就不会关心你实际上是在使用List