我如何在接口上实现静态方法?

我有一个从C#调用的第三方C ++ DLL。

这些方法是静态的。

我想抽象出来做一些unit testing,所以我创build了一个接口,其中的静态方法,但现在我的程序错误:

修饰符“静态”对此项无效

MyMethod cannot be accessed with an instance reference; qualify it with a type name instead 

我怎样才能实现这个抽象?

我的代码看起来像这样

 private IInterfaceWithStaticMethods MyInterface; public MyClass(IInterfaceWithStaticMethods myInterface) { this.MyInterface = myInterface; } public void MyMethod() { MyInterface.StaticMethod(); } 

您不能在C#中的接口上定义静态成员。 一个接口是一个契约,而不是一个实现。

我会build议像现在一样创build接口,但不要使用static关键字。 然后创build一个类StaticIInterface来实现接口并调用静态C ++方法。 要进行unit testing,创build另一个类FakeIInterface ,它也实现了接口,但是你需要处理你的unit testing。

一旦你定义了这两个类,你可以创build一个你需要的环境,并将其传递给MyClass的构造函数。

接口不能有静态成员,静态方法不能作为接口方法的实现。

你可以做的是使用一个明确的接口实现:

 public interface IMyInterface { void MyMethod(); } public class MyClass : IMyInterface { static void MyMethod() { } void IMyInterface.MyMethod() { MyClass.MyMethod(); } } 

或者,您可以简单地使用非静态方法,即使它们不访问任何特定于实例的成员。

静态成员在CLR中是完全合法的,而不是C#。

你可以在IL中实现一些粘连来连接实现细节。

不知道C#编译器是否允许调用它们?

请参阅:8.9.4接口types定义ECMA-335。

接口types必然是不完整的,因为他们没有提到接口types值的表示。 因此,接口types定义不能为接口types(即实例字段)的值提供字段定义,尽pipe它可以声明静态字段(见第8.4.3节)。

类似地,接口types定义不应该为其types值的任何方法提供实现。 但是,接口types定义可以(通常是)定义方法合同(方法名称和方法签名),这些合同应该通过支持types来实现。 接口types定义可以定义和实现静态方法(见第8.4.3节),因为静态方法与接口types本身相关联,而不是任何types的值。

你可以用reflection来调用它:

 MyInterface.GetType().InvokeMember("StaticMethod", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null); 

至于为什么你不能有一个接口的静态方法: 为什么不C#允许静态方法来实现一个接口?

不过,我build议删除静态方法,以支持实例方法。 如果这是不可能的,那么你可以将静态方法调用包装在一个实例方法中,然后你可以为它创build一个接口并从中运行你的unit testing。

 public static class MyStaticClass { public static void MyStaticMethod() {...} } public interface IStaticWrapper { void MyMethod(); } public class MyClass : IStaticWrapper { public void MyMethod() { MyStaticClass.MyStaticMethod(); } }