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

本文关键字:对象 实现 接口 实例化 参数传递 类型 | 更新日期: 2023-09-27 18:30:37

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

在另一个类中,我有一个将类型作为参数的方法,并且此类型必须实现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 之一中,您可以使用参数"调用()"它并返回该类的实例,就像您使用了"new"运算符一样。