2011-10-10 22 views
11

Digamos que definir alguna de las interfaces arbitraria:¿Transmitir a una interfaz no implementada explícitamente?

public interface IInterface 
{ 
    void SomeMethod(); 
} 

Y digamos que hay algunas clases que pasan a tener una interfaz pública a juego, a pesar de que no "se implementan IInterface". IE:

public class SomeClass 
{ 
    public void SomeMethod() 
    { 
     // some code 
    } 
} 

está ahí, sin embargo, una forma de obtener una referencia a una instancia IInterface SomeClass? IE:

SomeClass myInstance = new SomeClass(); 
IInterface myInterfaceReference = (IInterface)myInstance; 

Gracias

Respuesta

13

No, no hay forma de hacerlo. Si el tipo no implementa la interfaz, entonces no hay forma de convertirlo. La mejor forma de lograr un comportamiento similar al que desea es crear un tipo de contenedor que proporcione una implementación de IInterface para SomeClass.

public static class Extensions { 
    private sealed class SomeClassWrapper : IInterface { 
    private readonly SomeClass _someClass; 

    internal SomeClassWrapper(SomeClass someClass) { 
     _someClass = someClass; 
    } 

    public void SomeMethod() { 
     _someClass.SomeMethod(); 
    } 
    } 

    public static IInterface AsIInterface(this SomeClass someClass) { 
    return new SomeClassWrapper(someClass); 
    } 
} 

entonces usted puede hacer la siguiente llamada

SomeClass myInstance = new SomeClass(); 
IInterface myInterface = myInstance.AsIInterface(); 
+0

También sería posible usar la reflexión para encontrar el método en el contenedor para cualquier clase (o lanzar una excepción si no se encuentra) – Magnus

2

No. El hecho de que dos clases de pasar a tener métodos con el mismo nombre, no significa que se rigen por el mismo contrato. Es por eso que define el contrato al implementar explícitamente la (s) interfaz (es) apropiada (s).

2

El método implementado por SomeClass puede tener la misma firma que el de la interfaz, pero como no hereda/implementa la interfaz no hay forma de usar un molde en este escenario - no hay conformidad "accidental" - tiene que declarar explícitamente estado para cada clase que implementa una interfaz particular.

4

Si tiene acceso a la fuente, siempre se puede decorar la clase, si no es así, usted podría hacer un envoltorio:

public class InterfaceWrapper : IInterface 
{ 
    private readonly SomeClass _someClass; 

    public InterfaceWrapper(SomeClass someClass) { _someClass = someClass; } 

    public void SomeMethod() { _someClass.SomeMethod(); } 
} 
+0

¿Funcionará si heredo la clase si no está sellada e implemento la interfaz manteniendo la clase heredada vacío –

2

CSScriptLibrary.dll tiene un método de extensión que 'alinea' una instancia de objeto a una interfaz determinada:

También verifique el resto de la biblioteca, es una API realmente útil cuando se trata de reflejar un script C#.

Saludos cordiales.

Cuestiones relacionadas