2010-04-09 19 views
8

Tengo una pregunta sobre un problema con L2S, DataContext autogenerado y el uso de clases parciales. He abstraído mi contexto de datos y para cada tabla que uso, estoy implementando una clase con una interfaz. En el siguiente código, puede ver que tengo la interfaz y dos clases parciales. La primera clase está allí para asegurarse de que la clase en el contexto de datos generado automáticamente en Interfaz. La otra clase autogenerada se asegura de que el método de Interface esté implementado.Problema con la implementación de la interfaz en clases parciales

namespace PartialProject.objects 
{ 

public interface Interface 
{ 
    Interface Instance { get; } 
} 

//To make sure the autogenerated code inherits Interface 
public partial class Class : Interface { } 

//This is autogenerated 
public partial class Class 
{ 
    public Class Instance 
    { 
     get 
     { 
      return this.Instance; 
     } 
    } 
} 

} 

Ahora mi problema es que el método implementado en la clase autogenerada da el siguiente error: -> Propiedad 'Instancia no puede aplicar la propiedad de la interfaz 'PartialProject.objects.Interface'. Tipo debe ser 'PartialProjects.objects.Interface'. < -

¿Alguna idea de cómo se puede resolver este error? Tenga en cuenta que no puedo editar nada en el código autogenerado.

¡Gracias de antemano!

Respuesta

12

Puede resolver esto mediante la aplicación de la interfaz explícitamente:

namespace PartialProject.objects 
{ 
    public interface Interface 
    { 
    Interface Instance { get; } 
    } 

    //To make sure the autogenerated code inherits Interface 
    public partial class Class : Interface 
    { 
    Interface Interface.Instance 
    { 
     get 
     { 
     return Instance; 
     } 
    } 
    } 

    //This is autogenerated 
    public partial class Class 
    { 
    public Class Instance 
    { 
     get 
     { 
      return this.Instance; 
     } 
    } 
    } 
} 
+0

Esto es exactamente lo que estaba buscando:] ¡Muchas gracias! Funciona muy bien – Bas

+1

Votado. Gracias por una buena solución. Casi me "he roto" la cabeza tratando de resolver las limitaciones impuestas por las interfaces. –

+0

En caso de que alguien se encuentre con el siguiente error después de implementar la solución anterior, mire [aquí] (http://stackoverflow.com/questions/2669031/compilation-error-the-modifier-public-is-not-valid-for- this-item-while-crea): el modificador 'public' no es válido para este elemento, básicamente elimina cualquier modificador de acceso ya que esas propiedades se forzarán como privadas (lo cual tiene sentido cuando lo piensas). – dyslexicanaboko

1

Los tipos de devolución no son covariantes en C#. Como no se puede cambiar el código generado automáticamente la única solución que veo es cambiar la interfaz:

public interface Interface<T> 
{ 
    T Instance { get; } 
} 

y cambiar su clase parcial en consecuencia:

public partial class Class : Interface<Class> { } 
Cuestiones relacionadas