使用反射创建通用IList实例

Kum*_*mar 6 c# asp.net reflection

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

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

    Type type = Type.GetType(name);

    var list = Activator.CreateInstance(type);
Run Code Online (Sandbox Code Playgroud)

Fre*_*els 9

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

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

你做不到:

IList<int> l = new IList<int>();
Run Code Online (Sandbox Code Playgroud)

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


Run*_* FS 7

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

var type = Type.GetType(typeof (List<T>).AssemblyQualifiedName);
var list = (Ilist<T>)Activator.CreateInstance(type);
Run Code Online (Sandbox Code Playgroud)

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


Dar*_*rov 6

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