2010-04-09 5 views
8

У меня возник вопрос о проблеме с L2S, Autogenerated DataContext и использовании Partial Classes. Я абстрагировал свой datacontext, и для каждой используемой таблицы я реализую класс с интерфейсом. В приведенном ниже коде вы видите, что у меня есть интерфейс и два частичных класса. Первый класс - это просто, чтобы убедиться, что класс в автоматически генерируемом datacontext inherets Interface. Другой автогенерируемый класс обеспечивает реализацию метода из интерфейса.Проблема с реализацией интерфейса в частичных классах

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

} 

Теперь моя проблема заключается в том, что метод, реализованный в сгенерированном классе дает следующее сообщение об ошибке: -> Свойство «Instance» не может реализовать свойство из интерфейса «PartialProject.objects.Interface». Тип должен быть «PartialProjects.objects.Interface». < -

Любая идея, как эта ошибка может быть решена? Имейте в виду, что я ничего не могу редактировать в автогенерированном коде.

Заранее благодарен!

ответ

12

Вы можете решить эту проблему, реализовав интерфейс явно:

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

Это именно то, что я искал:] Спасибо большое! Отлично работает – Bas

+1

Проголосовал. Спасибо за хорошее решение. Я почти «взломал» свою голову, пытаясь обойти ограничения, налагаемые интерфейсами. –

+0

На всякий случай, когда кто-то сталкивается со следующей ошибкой после реализации вышеуказанного решения, посмотрите [здесь] (http://stackoverflow.com/questions/2669031/compilation-error-the-modifier-public-is-not-valid-for- this-item-while-crea): модификатор «public» недействителен для этого элемента - в основном удаляет все модификаторы доступа, поскольку эти свойства будут принудительно закрыты (что имеет смысл, когда вы думаете об этом). – dyslexicanaboko

1

Обратные типы не являются ковариантными в C#. Как вы не можете изменить автоматически сгенерированный код единственное решение, которое я вижу, чтобы изменить интерфейс:

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

И изменить частичный класс соответственно:

public partial class Class : Interface<Class> { } 
Смежные вопросы