¿Cómo puedo implementar métodos estáticos en una interfaz?

Tengo una DLL de C ++ de terceros a la que llamo desde C #.

Los métodos son estáticos.

Quiero abstraerlo para hacer algunas pruebas unitarias, así que creé una interfaz con los métodos estáticos que contiene, pero ahora mis errores de progtwig con:

El modificador ‘static’ no es válido para este ítem

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

¿Cómo puedo lograr esta abstracción?

Mi código se ve así

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

No puede definir miembros estáticos en una interfaz en C #. Una interfaz es un contrato para instancias .

Recomendaría crear la interfaz tal como está actualmente, pero sin la palabra clave estática. Luego cree una clase StaticIInterface que implemente la interfaz y llame a los métodos estáticos de C ++. Para realizar pruebas de unidad, cree otra clase FakeIInterface , que también implementa la interfaz, pero hace lo que necesita para manejar sus pruebas de unidad.

Una vez que haya definido estas 2 clases, puede crear la que necesita para su entorno y pasarla al constructor de MyClass .

Las interfaces no pueden tener miembros estáticos y los métodos estáticos no pueden usarse como implementación de métodos de interfaz.

Lo que puedes hacer es usar una implementación de interfaz explícita:

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

Alternativamente, puede usar métodos no estáticos, incluso si no acceden a ningún miembro específico de la instancia.

Los miembros estáticos son perfectamente legales en el CLR, pero no C #.

Podría implementar algo de pegamento en IL para vincular los detalles de la implementación.

¿No estoy seguro si el comstackdor de C # permitiría llamarlos?

Ver: 8.9.4 Definición del tipo de interfaz ECMA-335.

Los tipos de interfaz son necesariamente incompletos, ya que no dicen nada sobre la representación de los valores del tipo de interfaz. Por esta razón, una definición de tipo de interfaz no proporcionará definiciones de campo para los valores del tipo de interfaz (es decir, campos de instancia), aunque puede declarar campos estáticos (consulte §8.4.3).

De manera similar, una definición de tipo de interfaz no proporcionará implementaciones para ningún método en los valores de su tipo. Sin embargo, una definición de tipo de interfaz puede, y generalmente lo hace, definir contratos de método (nombre del método y firma del método) que deben implementarse por tipos de soporte. Una definición de tipo de interfaz puede definir e implementar métodos estáticos (ver §8.4.3), ya que los métodos estáticos están asociados con el tipo de interfaz en lugar de con cualquier valor del tipo.

Se podría invocar con reflexión:

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

En cuanto a por qué no puede tener un método estático en una interfaz: ¿Por qué C # no permite que los métodos estáticos implementen una interfaz?

Sin embargo, sugeriría eliminar los métodos estáticos a favor de los métodos de instancia. Si eso no es posible, entonces podría ajustar las llamadas al método estático dentro de un método de instancia, y luego puede crear una interfaz para eso y ejecutar sus pruebas unitarias a partir de eso.

es decir

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