2010-04-09 10 views
8

Ich habe eine Frage zu einem Problem mit L2S, Autogenerated DataContext und der Verwendung von Partial Classes. Ich habe meinen Datenkontext abstrahiert und für jede Tabelle, die ich verwende, implementiere ich eine Klasse mit einer Schnittstelle. In dem Code unten sehen Sie, dass ich die Schnittstelle und zwei Teilklassen habe. Die erste Klasse ist nur dazu da, um sicherzustellen, dass die Klasse im automatisch generierten Datenkontext die Schnittstelle enthält. Die andere automatisch generierte Klasse stellt sicher, dass die Methode von Interface implementiert ist.Problem mit Schnittstellenimplementierung in Teilklassen

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; 
     } 
    } 
} 

} 

Nun mein Problem ist, dass das in der automatisch generierten Klasse implementiert Methode den folgenden Fehler gibt: -> Property ‚instance‘ kann nicht Eigentum von der Schnittstelle ‚PartialProject.objects.Interface‘ implementieren. Der Typ sollte 'PartialProjects.objects.Interface' sein. < -

Irgendeine Idee, wie dieser Fehler gelöst werden kann? Beachten Sie, dass ich im automatisch generierten Code nichts ändern kann.

Vielen Dank im Voraus!

Antwort

12

Sie dies durch die Implementierung lösen kann Schnittstelle explizit:

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

Das ist genau das, was ich gesucht habe:] Vielen Dank! Funktioniert hervorragend – Bas

+1

Gewählt. Danke für die nette Lösung. Ich habe meinen Kopf fast "geknackt", indem ich versuchte, Einschränkungen durch Schnittstellen zu umgehen. –

+0

Nur für den Fall, dass jemand nach der Implementierung der obigen Lösung in den folgenden Fehler auftritt, schauen Sie [hier] (http://stackoverflow.com/questions/2669031/compilation-error-the-modifier-public-is-not-valid-for-- this-item-while-crea): Der Modifikator 'public' ist für dieses Objekt nicht gültig - entferne grundsätzlich alle Zugriffsmodifikatoren, da diese Eigenschaften als private erzwungen werden (was sinnvoll ist, wenn du darüber nachdenkst). – dyslexicanaboko

1

Rückgabetypen sind in C# nicht kovariant. Da Sie nicht den automatisch generierten Code sehe ich ändern kann, die einzige Lösung ist die Schnittstelle zu ändern:

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

Und dementsprechend Ihre Teil-Klasse ändern:

public partial class Class : Interface<Class> { }