Сохранение в переменную generic EntitySet в C # (Linq To SQL)

#c# #winforms #linq #linq-to-sql #user-controls

#c# #winforms #linq #linq-to-sql #пользовательские элементы управления

Вопрос:

У меня есть два класса, сгенерированных Linq для SQL RequestTowns и OfferTowns , оба реализуют один и тот же интерфейс в частичных классах.

 public interface IRouteTable
{      
    int TownID { get; set; }
}

public partial class RequestTowns : IRouteTable
{
   int IRouteTable.TownID
    {
        get { return this.TownID; }
        set { this.TownID = value; }
    }
}
public partial class OfferTowns : IRouteTable
{
     // ... same properties as in RequestTowns
}
  

С другой стороны, у меня есть UserControl, который я хочу заполнить из родительской формы, вызывая следующий метод:

 EntitySet<IRouteTable> Route { get; set; }

    public void SetSourceObject<TEntity>(EntitySet<TEntity> Source) where TEntity : class, IRouteTable
    {
        Route = Source; // <-- Compiler error is here        
    }
  

Сохранение исходного набора объектов в переменной дает возможность использовать объекты CRUD в других методах этого пользовательского элемента управления. Но неявное преобразование отклоняется:

 Cannot implicitly convert type 'EntitySet<RequestTowns>' to 'EntitySet<IRouteTable>'
  

У меня есть разные варианты для его обработки:

  1. Создайте не универсальный UserControl и избавьтесь от IRouteTable интерфейса;
  2. создавайте публичные события ItemAdded , ItemRemoved , ItemChanged и обрабатывайте их в форме вызова, опять же нестандартным способом;
  3. преобразуйте EntitySet в общий List , передайте его в UserControl и передавайте обратно только при закрытии формы;
  4. приведите EntitySet какой-нибудь способ, чтобы сделать компилятор счастливым;
  5. есть еще идеи?

Почему EntitySet ы интерфейса и класса, которые реализуют этот интерфейс, не могут быть преобразованы неявно? Как я могу заставить это работать наиболее элегантным способом?

Комментарии:

1. Почему ваш UserControl зависит от EntitySet (объект уровня доступа к данным)? Я бы ввел промежуточный объект данных для передачи в SetSourceObject и внутри UserControl. Например, IEnumerable<IRoute>. И преобразуйте в него любые объекты, которые вам нужны. Или просто создайте фиктивные объекты для UnitTests, или пока уровень доступа к данным еще не завершен. Я думаю, что ваш 3-й вариант охватывает это, поэтому я голосую за него. Попробуйте разделить свой код.

2. @OleksandrPshenychnyy Ты прав. Моему элементу управления абсолютно не хватает осведомленности о данных. Но я боюсь, что мне пришлось бы отслеживать изменения объекта самостоятельно. Это была единственная причина передать весь набор объектов элементу управления. Тем не менее, я постараюсь применить SoC. Спасибо за ваш ответ.