关于C#:如何在接口上实现静态方法?

How can I implement static methods on an interface?

我有一个第三方C++DLL,我用C语言调用。

这些方法是静态的。

我想把它抽象出来做一些单元测试,所以我用其中的静态方法创建了一个接口,但是现在我的程序出错了:

The modifier 'static' is not valid for this item

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

我如何才能实现这个抽象?

我的代码看起来像这样

1
2
3
4
5
6
7
8
9
10
11
private IInterfaceWithStaticMethods MyInterface;

public MyClass(IInterfaceWithStaticMethods myInterface)
{
  this.MyInterface = myInterface;
}

public void MyMethod()
{
  MyInterface.StaticMethod();
}


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

您可以做的是使用显式接口实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public interface IMyInterface
{
    void MyMethod();
}

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

    void IMyInterface.MyMethod()
    {
        MyClass.MyMethod();
    }
}

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


不能在C中的接口上定义静态成员。接口是实例的契约。

我建议您像现在一样创建接口,但不要使用static关键字。然后创建一个实现该接口的类EDCOX1,0,调用静态C++方法。要进行单元测试,请创建另一个类FakeIInterface,它也实现接口,但执行处理单元测试所需的操作。

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


静态成员在clr中是完全合法的,而不是c。

您可以在IL中实现一些粘合来链接实现细节。

不确定C编译器是否允许调用它们?

见:8.9.4接口类型定义ECMA-335。

Interface types are necessarily incomplete since they say nothing
about the representation of the values of the interface type. For this
reason, an interface type definition shall not provide field
definitions for values of the interface type (i.e., instance fields),
although it can declare static fields (see §8.4.3).

Similarly, an interface type definition shall not provide
implementations for any methods on the values of its type. However, an
interface type definition can—and usually does—define method contracts
(method name and method signature) that shall be implemented by
supporting types. An interface type definition can define and
implement static methods (see §8.4.3) since static methods are
associated with the interface type itself rather than with any value
of the type.


您可以通过反射调用它:

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


至于为什么不能在接口上使用静态方法:为什么不允许静态方法实现接口?

但是,我建议删除静态方法,而不是实例方法。如果这是不可能的,那么可以将静态方法调用包装在实例方法中,然后可以为此创建一个接口并从中运行单元测试。

工业工程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static class MyStaticClass
{
    public static void MyStaticMethod()
    {...}
}

public interface IStaticWrapper
{
    void MyMethod();
}

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