我正在尝试使用反射创建一个通用的对象列表。以下代码引发错误无法创建接口实例。。我可以将IList更改为List并且它工作正常,但我想知道是否有办法让这个与IList一起工作。
var name = typeof (IList<T>).AssemblyQualifiedName;
Type type = Type.GetType(name);
var list = Activator.CreateInstance(type);
答案 0 :(得分:9)
不,无法创建接口实例。
.NET(或者说Activator.CreateInstance方法)应该如何决定应该实例化该接口的哪个实现?
你做不到:
IList<int> l = new IList<int>();
要么,你呢? 您无法实例化接口,因为接口通常是定义或描述类型应实现的功能的合同。
答案 1 :(得分:7)
如果你这样做,你必须实例化一个具体的类
var type = Type.GetType(typeof (List<T>).AssemblyQualifiedName);
var list = (Ilist<T>)Activator.CreateInstance(type);
您将获得成功(只要您提供T的有效值)。
答案 2 :(得分:6)
Activator.CreateInstance
方法调用默认构造函数来创建作为参数传递的类型的实例。此类型必须是非抽象的而不是接口,并且具有默认构造函数,以便此函数成功。
答案 3 :(得分:3)
我认为你不能让这个工作,因为你不知道你需要创建什么类型的对象。
抽象类会遇到同样的问题。
答案 4 :(得分:2)
唔不,那是不可能的。错误信息非常清楚。您无法创建接口实例。
如何知道您想要一个实例的特定类?通常,许多类实现相同的接口。它应该随机挑一个吗? ; - )
这与反射无关,因为您通常也无法“实例化”接口。只分配实现接口的对象,然后传递接口引用。
答案 5 :(得分:2)
显然,您无法直接实例化IList<T>
类型的对象,因为它是一种接口类型。
您应该尝试实例化List<T>
,然后将其作为IList<T>
返回。
答案 6 :(得分:2)
IList<T> Create<T>()
{
Type baseListType = typeof(List<>);
Type listType = baseListType.MakeGenericType(typeof(T));
return Activator.CreateInstance(listType) as IList<T>;
}
答案 7 :(得分:0)
好吧,你可以在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&lt; T&gt;并且您的调用代码并不关心您实际使用的是List&lt; T&gt;。