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

jit*_*itm 8 .net c# reflection

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

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

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

非静态方法需要目标

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

Dan*_*ant 13

如果您完全确定接口方法不会影响对象状态(这通常是一个非常糟糕的假设),您可以通过调用FormatterServices.GetUnitializedObject来创建实例而无需调用构造函数.就个人而言,我强烈建议不要这样做,因为当您在未初始化类型上调用接口方法时,可能会发生任何数量的错误.


小智 10

如果它是实例方法,则需要一个用于调用该方法的实例.因此"实例"方法.

实例方法可以依赖于实例变量,反射不会知道,因此它不能保证实例方法不会改变定义它的类型实例的状态.

这就是为什么你会得到那些FxCop警告(在这里解释)"使这个方法静态,因为它不会改变类的状态".