#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>'
У меня есть разные варианты для его обработки:
- Создайте не универсальный
UserControl
и избавьтесь отIRouteTable
интерфейса; - создавайте публичные события
ItemAdded
,ItemRemoved
,ItemChanged
и обрабатывайте их в форме вызова, опять же нестандартным способом; - преобразуйте
EntitySet
в общийList
, передайте его вUserControl
и передавайте обратно только при закрытии формы; - приведите
EntitySet
какой-нибудь способ, чтобы сделать компилятор счастливым; - есть еще идеи?
Почему EntitySet
ы интерфейса и класса, которые реализуют этот интерфейс, не могут быть преобразованы неявно? Как я могу заставить это работать наиболее элегантным способом?
Комментарии:
1. Почему ваш UserControl зависит от EntitySet (объект уровня доступа к данным)? Я бы ввел промежуточный объект данных для передачи в SetSourceObject и внутри UserControl. Например, IEnumerable<IRoute>. И преобразуйте в него любые объекты, которые вам нужны. Или просто создайте фиктивные объекты для UnitTests, или пока уровень доступа к данным еще не завершен. Я думаю, что ваш 3-й вариант охватывает это, поэтому я голосую за него. Попробуйте разделить свой код.
2. @OleksandrPshenychnyy Ты прав. Моему элементу управления абсолютно не хватает осведомленности о данных. Но я боюсь, что мне пришлось бы отслеживать изменения объекта самостоятельно. Это была единственная причина передать весь набор объектов элементу управления. Тем не менее, я постараюсь применить SoC. Спасибо за ваш ответ.