Code: Select all
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; }
}
Meine Lösung besteht aus einer Reihe von Wrapper-Typen, die automatisch generiert werden können. Für den Kunden erstellen wir beispielsweise die folgenden Schnittstellen:
Code: Select all
public interface NoCustomer { }
public interface ICustomer : NoCustomer
where TAddr : NoAddress
where TOrders : NoOrder
{
string Name { get; set; }
}
Code: Select all
public static class CustomerExtensions
{
public static IAddress Address(this ICustomer customer)
where TOrders : NoOrder
{
...
}
}
Das ist alles schön und gut, aber das Problem entsteht, wenn ich versuche, die Verwendung der Typen ergonomischer zu gestalten. Standardmäßig beginnen die Typen ziemlich ausführlich zu werden, und schlimmer noch, Sie verbringen viele Zeichen damit, über Typen zu reden, die noch nicht einmal geladen sind. Zum Beispiel:
Code: Select all
ICustomer
Code: Select all
ICustomer
Ich habe jedoch Schwierigkeiten, herauszufinden, wie das funktioniert.
- Mein erster Ansatz besteht einfach darin, die Schnittstellen „NoCustomer“, „NoAddress“ usw. durch eine einzige Schnittstelle „No“ zu ersetzen. Das Problem ist, dass jetzt alle Schnittstellentypen vom Typ No erben, sodass Sie falsche Typargumente angeben können und der Compiler nichts dagegen tun kann (z. B. würde ICustomer gut kompilieren!).
- Mein zweiter Ansatz besteht darin, zu versuchen, sowohl NoCustomer-Typen als auch auch einen generischen No-Typ zu haben, der von allen erbt sie. Wir könnten also ICustomer oder alternativ ICustomer schreiben, aber nicht ICustomer. Oberflächlich betrachtet scheint es, als würde es funktionieren, aber das Problem ist, dass ICustomer von ICustomer
Mobile version