Z brakiem abstract
markerem na Entity
zakładam, że To
/FromXElement
użycie odbicie i powinien działać na każdym podtypu Entity
. I zaleca, aby uporządkować swoje klasy w następujący sposób:
public class Entity
{
public XElement ToXElement() { ... }
protected static T FromXElement<T>(XElement x)
where T : Entity
{
...
}
}
public class Category : Entity
{
public static Category : FromXElement(XElement x)
{
return FromXElement<Category>(x);
}
}
The „Gotowa” jest minimalne, a to nie wymaga, by twórczo obejść system typu. Nie musisz się martwić brakiem wspólnej bazy lub ręcznych konwersji.Jeśli chcesz, możesz całkowicie wyeliminować boilerplate i po prostu skonstruować swoje przedmioty bezpośrednio od Entity
:
public class Entity
{
public XElement ToXElement() { ... }
public static T FromXElement<T>(XElement x)
where T : Entity
{
...
}
}
W istocie, co robisz wdraża klasę typu, C# nie obsługuje bezpośrednio. Istnieje wiele sposobów obejścia tego problemu, ale zwykle uważam, że są one bardziej kłopotliwe, niż są warte, szczególnie jeśli chodzi o metody statyczne. Jeśli C# obsługiwane metody statycznego rozszerzenia, byłoby to proste, ale niestety nie.
Co próbujesz osiągnąć? Dlaczego potrzebujesz tych różnych typów w kolekcji? –
A klasy Kategoria i kolekcja to ogólne typy ... siebie? –
@DanielPersson nazywa się [ciekawie powtarzającym się szablonem wzoru] (http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx) –