如何实例化一个参数传递类型的对象,需要实现某个接口?

How to instantiate an object of a type passed by parameter, that needs to implement a certain interface?

假设我有一个名为 IMyInterface 的接口,以及一个名为 MyClass 的 class 实现 IMyInterface

在另一个 class 中,我有一个将类型作为参数的方法,并且此类型必须实现 IMyInterface 才能有效。例如MyClass 将是一个有效的论点。然后在方法中我将实例化一个由参数传递的类型的对象。

我该如何实现?如果不可能,什么解决方案会产生类似的效果?

答案分为两部分。首先,您应该通过 Type.IsAssignableFrom:

验证类型
var implementInterface = (typeof(IMyInterface)).IsAssignableFrom(type);
if(!implementInterface)
    // return null, throw an exception or handle this scenario in your own way

接下来你可以实例化一个对象。这里有几种方法可以动态创建某种类型的对象,一种是使用 Activator.CreateInstance:

// create an object of the type
var obj = (IMyInterface)Activator.CreateInstance(type);

您将在 obj 中获得 MyClass 的一个实例。

另一种方法是使用反射:

// get public constructors
var ctors = type.GetConstructors(BindingFlags.Public);

// invoke the first public constructor with no parameters.
var obj = ctors[0].Invoke(new object[] { });

并且从返回的 ConstructorInfo 之一,您可以 "Invoke()" 它带有参数并返回 class 的实例,就好像您使用了 "new" 运算符一样。