2010-04-09 12 views
8

Mam pytanie dotyczące problemu z L2S, Autogenerated DataContext i użycia klas częściowych. Wyodrębniłem mój datacontext i dla każdej używanej tabeli implementuję klasę z interfejsem. W poniższym kodzie widzę, że mam interfejs i dwie częściowe klasy. Pierwsza klasa jest właśnie tam, aby upewnić się, że klasa w automatycznie generowanym interfejsie danych inherets Interface. Druga generowana automatycznie klasa zapewnia implementację metody z interfejsu.Problem z implementacją interfejsu w klasach częściowych

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

} 

Teraz moim problemem jest to, że metoda realizowane w klasie wygenerowany automatycznie daje następujący błąd: -> właściwość „Instance” nie może realizować własność z interfejsu „PartialProject.objects.Interface”. Typ powinien być "PartialProjects.objects.Interface". < -

Czy masz pomysł, jak rozwiązać ten błąd? Pamiętaj, że nie mogę edytować niczego w automatycznie wygenerowanym kodzie.

Z góry dziękuję!

Odpowiedz

12

Problem ten można rozwiązać poprzez wdrożenie Interfejs jawnie:

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

Dokładnie to, czego szukałem:] Wielkie dzięki! Działa świetnie – Bas

+1

Głosowano. Dziękuję za miłe rozwiązanie. Niemal "złamałem" głowę, próbując zrobić obejście ograniczeń nałożonych przez interfejsy. –

+0

Na wypadek, gdyby ktokolwiek popadł w następujący błąd po wdrożeniu powyższego rozwiązania, patrz [tutaj] (http://stackoverflow.com/questions/2669031/compilation-error-the-modifier-public-is-not-valid-for- this-item-while-crea): modyfikator "public" nie jest prawidłowy dla tego elementu - w zasadzie usuń wszelkie modyfikatory dostępu, ponieważ te właściwości będą wymuszane jako prywatne (co ma sens, gdy się nad tym zastanowisz). – dyslexicanaboko

1

Typy zwrotów nie są kowariantne w języku C#. Jak nie można zmienić automatycznie wygenerowany kod jedynym rozwiązaniem widzę to zmienić interfejs:

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

i zmienić swoje częściowej klasy odpowiednio:

public partial class Class : Interface<Class> { } 
Powiązane problemy