Проблема с реализацией интерфейса в частичных классах - PullRequest
8 голосов
/ 09 апреля 2010

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

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

}

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

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

Заранее спасибо!

Ответы [ 2 ]

12 голосов
/ 09 апреля 2010

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

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;
        }
     }
  }
}
1 голос
/ 09 апреля 2010

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

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

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

public partial class Class : Interface<Class> { }
...