Ho seguenti classi:C# - gettato classe generica alla sua base non generica classe
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>
{
}
Il SalesOffice è solo uno dei pochi classi che rappresentano diversi livelli gerarchici del cliente. Ora ho bisogno di passare attraverso questa gerarchia da un certo punto (CustomerBase). Non riesco a capire come implementare senza usare la reflection. Mi piacerebbe realizzare qualcosa del tipo:
public void WalkHierarchy(CustomerBase start)
{
Print(start.CustomerNumber);
if (start is CustomerWithChildern<>)
{
foreach(ch in start.Childern)
{
WalkHierarchy(ch);
}
}
}
C'è qualche possibilità che io possa ottenere qualcosa di simile a questo lavoro?
La soluzione basata su suggerita ha-childern interfaccia ho implementato:
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);
}
}
}
Questa è la soluzione migliore in quanto racchiude in sé l'attuazione piedi e appena fa la cosa giusta senza forzare al chiamante di essere a conoscenza dei dettagli di implementazione. – recursive
Grandi elogi da parte di qualcuno chiamato "ricorsivo". ;-) –
Il mio ultimo grande progetto .NET ha avuto un simile requisito, e il modo di John Saunders è molto simile a quello che ho fatto io. Ha reso molte cose molto più facili :) – OregonGhost