He siguientes clases:C# - Reparto clase genérica a su clase base no genérico
public abstract class CustomerBase
{
public long CustomerNumber { get; set; }
public string Name { get; set; }
}
public abstract class CustomerWithChildern<T> : CustomerBase
where T: CustomerBase
{
public IList<T> Childern { get; private set; }
public CustomerWithChildern()
{
Childern = new List<T>();
}
}
public class SalesOffice : CustomerWithChildern<NationalNegotiation>
{
}
El SalesOffice es sólo una de las pocas clases que representan diferentes niveles de la jerarquía de clientes. Ahora necesito recorrer esta jerarquía desde algún punto (CustomerBase). No puedo entender cómo implementar sin usar la reflexión. Me gustaría implementar algo como:
public void WalkHierarchy(CustomerBase start)
{
Print(start.CustomerNumber);
if (start is CustomerWithChildern<>)
{
foreach(ch in start.Childern)
{
WalkHierarchy(ch);
}
}
}
¿Hay alguna posibilidad de que funcione algo así?
La solución basada en sugerida tiene-hijos también he implementado la interfaz:
public interface ICustomerWithChildern
{
IEnumerable ChildernEnum { get; }
}
public abstract class CustomerWithChildern<T> : CustomerBase, ICustomerWithChildern
where T: CustomerBase
{
public IEnumerable ChildernEnum { get { return Childern; } }
public IList<T> Childern { get; private set; }
public CustomerWithChildern()
{
Childern = new List<T>();
}
}
public void WalkHierarchy(CustomerBase start)
{
var x = start.CustomerNumber;
var c = start as ICustomerWithChildern;
if (c != null)
{
foreach(var ch in c.ChildernEnum)
{
WalkHierarchy((CustomerBase)ch);
}
}
}
Esta es la mejor solución, ya que encapsula la aplicación caminar y simplemente hace lo correcto sin obligar a la persona que llama a estar al tanto de los detalles de implementación. – recursive
Alta alabanza de alguien llamado, "recursivo". ;-) –
Mi último gran proyecto .NET tenía un requisito similar, y el de John Saunders es muy parecido al que hice. Hizo muchas cosas mucho más fácil :) – OregonGhost