.NET思考:如何在不创建实例的情况下调用接口方法?

时间:2010-05-07 13:39:17

标签: c# .net reflection

我有这样的情况,我必须使用反射调用接口的方法,像这样

object x = null;
MethodInfo method = interfaceExists.GetMethod("ShutDown");
method.Invoke(x, new object[] { 4 })

如你所见,我不创建对象的实例!而且,正如我所想,我收到异常

  

非静态方法需要目标

问题,我可以在不创建界面实例的情况下使用反射调用界面方法,如果是,我该怎么办?

6 个答案:

答案 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 });
相关问题