c# - cast classe générique à sa base non-classe générique

J'ai des classes suivantes:

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>
{
}

La SalesOffice est juste l'une des rares classes qui représentent les différents niveaux de la hiérarchie client. Maintenant, j'ai besoin de marcher à travers cette hiérarchie à partir d'un certain moment (CustomerBase). Je peux pas comprendre comment le mettre en œuvre sans l'aide de la réflexion. J'aimerais mettre en place quelque chose comme:

    public void WalkHierarchy(CustomerBase start)
    {
        Print(start.CustomerNumber);
        if (start is CustomerWithChildern<>)
        {
            foreach(ch in start.Childern)
            {
                WalkHierarchy(ch);
            }
        }
    }

Est-il une chance que je pourrais obtenir quelque chose de ce genre de travail?


La solution basée sur les a-sont envoyés interface que j'ai mis en œuvre:

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);
            }
        }
    }

OriginalL'auteur Buthrakaur | 2009-04-02