如何实例化一个参数传递类型的对象,需要实现某个接口?
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" 运算符一样。
假设我有一个名为 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" 运算符一样。