我有这样的情况,我必须使用反射调用接口的方法,像这样
object x = null;
MethodInfo method = interfaceExists.GetMethod("ShutDown");
method.Invoke(x, new object[] { 4 })
如你所见,我不创建对象的实例!而且,正如我所想,我收到异常
非静态方法需要目标
问题,我可以在不创建界面实例的情况下使用反射调用界面方法,如果是,我该怎么办?
答案 0 :(得分:13)
如果您完全确定接口方法不会影响对象状态(这通常是一个非常糟糕的假设),您可以通过调用FormatterServices.GetUnitializedObject来创建实例而无需调用构造函数。就个人而言,我强烈建议不要这样做,因为当你在未初始化的类型上调用接口方法时,可能会发生任何数量的坏事。
答案 1 :(得分:10)
如果是实例方法,则需要一个用于调用该方法的实例。因此“实例”方法。
实例方法可能依赖于实例变量,反射不会知道,因此无法保证实例方法不会改变定义它的类型实例的状态。
这就是为什么你会得到那些关于FxCop的警告(在这里解释)“将这个方法设为静态,因为它不会改变类的状态”。
答案 2 :(得分:4)
如果方法是非静态的,则必须创建一个对象实例才能使用它。由于接口不能有静态方法,因此需要创建一个对象的实例,并在其上使用接口来执行该方法。
答案 3 :(得分:2)
您的非静态接口方法最终需要调用在对象上实现的方法。如果该方法的实现不存在,那么就不能调用真正的方法。
答案 4 :(得分:1)
接口没有实现,所以你不能在没有实现该接口的对象实例的情况下调用它的方法。
答案 5 :(得分:1)
你可以在不创建实例的情况下调用接口方法吗?不。接口例如是成员;静态类成员与接口无关。
您可以通过提供界面的静态实现
来获得您想要的结果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 });