2010-05-07 50 views
7

我有情况我有使用反射来调用接口的方法,这样.NET反射:如何在不创建实例的情况下调用接口的方法?

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

正如你可以看到,我不对象的创建实例!而且,我可以认为,我收到例外

非静态方法需要一个目标

和问题,我可以调用使用反射界面的方法,而无需创建接口的实例,如果是,如何我能行 ?

+0

想想这样:如果你可以调用它,这个方法实际上会做什么? – Aaronaught 2010-05-07 13:53:50

回答

12

接口方法不会影响对象状态(这通常是一个非常糟糕的假设),您可以通过调用FormatterServices.GetUnitializedObject而不调用构造函数来创建实例。就个人而言,我强烈建议不要这样做,因为在调用未初始化类型的接口方法时,可能会发生许多不好的事情。

+3

秘密忍者技巧+1。 – Will 2010-05-07 14:02:21

+0

谢谢,这对我来说可能是合理的 – jitm 2010-05-07 21:58:14

10

如果它是一个实例方法,则需要一个实例来调用该方法。因此“实例”方法。

实例方法可以具有实例变量的依赖关系,这种反射不会知道,所以它不能保证实例方法不会改变它定义类型的实例的状态。

这就是为什么你会得到有关FxCop警告(在这里解释)“使这个方法是静态的,因为它不会改变类的状态”。

+0

如何使界面静态方法? – jitm 2010-05-07 13:47:17

+0

您不能在接口上使用静态方法。如果您不希望将该类标记为抽象类,并实现该接口,那么您将需要类上的静态方法,然后从中派生出它的子类。 – Ian 2010-05-07 13:50:06

+0

@jitm你不能。如果你真的需要这样做,可以考虑为你的基类放弃你的接口。当然,你不能覆盖基类的静态方法,所以你可能仍然被搞砸了。尝试询问另一个关于SO的问题(不要使用这个问题),详细说明你正在尝试做什么,并询问是否有更好的方法。 – Will 2010-05-07 13:50:33

4

如果该方法是非静态的,则必须创建一个对象实例才能使用它。由于接口不能有静态方法,所以你需要创建一个带有接口的对象实例来执行该方法。

1

一个接口没有实现,因此如果没有实现该接口的对象实例就无法调用它的方法。

2

您的非静态接口方法最终需要调用在对象上实现的方法。如果该方法的实现不存在,则不能调用真正的方法。

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 }); 
+0

谢谢,我知道。 – jitm 2010-05-07 21:47:59

相关问题