Код: Выделить всё
public class Address
{
public string Line1 { get; set; }
public string City { get; set; }
}
public class Customer
{
public string Name { get; set; }
public Address Address { get; set; }
public ICollection Orders { get; set; }
}
public class Order
{
public int OrderNumber { get; set; }
public ICollection[*] Lines { get; set; }
}
public class Line
{
public int Qty { get; set; }
public string Product { get; set; }
}
Мое решение — это набор типов-оболочек, которые можно генерировать автоматически. Например, для Заказчика мы создаем следующие интерфейсы:
Код: Выделить всё
public interface NoCustomer { }
public interface ICustomer : NoCustomer
where TAddr : NoAddress
where TOrders : NoOrder
{
string Name { get; set; }
}
Код: Выделить всё
public static class CustomerExtensions
{
public static IAddress Address(this ICustomer customer)
where TOrders : NoOrder
{
...
}
}
Все это хорошо, но проблема возникает, когда я пытаюсь сделать типы более эргономичными в использовании. По умолчанию типы становятся довольно многословными и, что еще хуже, в конечном итоге вы тратите много символов на разговоры о типах, которые даже не загружены. Например,
Код: Выделить всё
ICustomer
Код: Выделить всё
ICustomer
Однако мне трудно понять, как заставить это работать.
- Мой первый подход — просто заменить интерфейсы NoCustomer, NoAddress и т. д. одним интерфейсом No. Проблема в том, что теперь все типы интерфейса наследуются от типа No, поэтому вы можете предоставлять неверные аргументы типа, и компилятор ничего не может с этим поделать (например, ICustomer будет нормально компилироваться!).
- Мой второй подход — попытаться использовать оба типа NoCustomer, а также также общий тип No, который наследует от всех из них. Таким образом, мы могли бы написать ICustomer или, альтернативно, ICustomer, но не ICustomer. На первый взгляд кажется, что это сработает, но проблема в том, что ICustomer наследуется от ICustomer
Подробнее здесь: https://stackoverflow.com/questions/798 ... ee-of-data
Мобильная версия