使用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