使用反射创建通用IList实例

时间:2010-02-04 10:45:07

标签: c# asp.net reflection

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

    var name = typeof (IList<T>).AssemblyQualifiedName;

    Type type = Type.GetType(name);

    var list = Activator.CreateInstance(type);

8 个答案:

答案 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.aspxhttp://blogs.msdn.com/brada/archive/2004/10/10/240523.aspx

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

只需创建一个列表,然后返回IList&lt; T&gt;并且您的调用代码并不关心您实际使用的是List&lt; T&gt;。