我有一个情况,需要使用反射调用接口的方法,就像这样:
object x = null;
MethodInfo method = interfaceExists.GetMethod("ShutDown");
method.Invoke(x, new object[] { 4 })
您可以看到,我没有创建对象实例!而且,我猜测,我会收到异常
非静态方法要求有一个目标
问题是,我能否在不创建接口实例的情况下使用反射调用接口方法?如果可以,我该如何做呢?
我有一个情况,需要使用反射调用接口的方法,就像这样:
object x = null;
MethodInfo method = interfaceExists.GetMethod("ShutDown");
method.Invoke(x, new object[] { 4 })
您可以看到,我没有创建对象实例!而且,我猜测,我会收到异常
非静态方法要求有一个目标
问题是,我能否在不创建接口实例的情况下使用反射调用接口方法?如果可以,我该如何做呢?
如果是实例方法,您需要一个实例来调用该方法。因此称之为“实例”方法。
实例方法可能依赖于实例变量,反射无法了解这些变量,因此无法保证实例方法不会更改其所定义类型的实例的状态。
这就是为什么您会收到 FxCop 警告的原因(在此进行了转述):“将此方法设置为静态方法,因为它不会更改类的状态”。
如果方法是非静态的,您需要创建一个对象实例来使用它。由于接口不能有静态方法,因此您需要创建一个带有接口的对象实例来执行该方法。
您的非静态接口方法最终需要调用已实现于对象上的方法。如果该方法的实现不存在,则无法调用真正的方法。
你能在不创建实例的情况下调用接口方法吗? 不行。接口是针对实例成员的;静态类成员与接口无关。
您可以通过提供接口的静态实现来获得所需的内容,
public class MyImplementation : IMyInterface
{
public static readonly Instance = new MyImplementation();
private MyImplementation() { }
}
// ...then your code might look like:
MethodInfo method = typeof(IMyInterface).GetMethod("ShutDown");
method.Invoke(MyImplementation.Instance, new object[] { 4 })
或者你可以创建一个扩展方法:
public static class MyExtensions
{
public static void ShutDown(this IMyInterface obj, ...) { ... }
}
// ...then your code might look like:
object x = null;
MethodInfo method = typeof(MyExtensions).GetMethod("ShutDown");
method.Invoke(x as IMyInterface, new object[] { 4 });
接口没有实现,因此您无法在未实现该接口的对象实例中调用其方法。