c# - 将泛型类转换为其基类非泛型类

But*_*aur 7 c# generics

我有以下课程:

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>
{
}
Run Code Online (Sandbox Code Playgroud)

SalesOffice只是代表不同级别的客户层次结构的少数类之一.现在我需要从某个角度(CustomerBase)遍历这个层次结构.我不知道如何在不使用反射的情况下实现.我想实现类似的东西:

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

我有没有机会得到这样的工作?


基于我实现的has-childern接口的解决方案:

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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Joh*_*ers 7

您可以将WalkHierarchy方法移动到基类并使其成为虚拟.基类实现只处理当前节点.对于CustomerWithChildern<T>班级,覆盖将进行实际行走.


Mit*_*ers 2

我相信您想要进行查找以决定对界面执行操作。

因此,也许添加一个“IWalkable”接口来公开步行所需的信息,然后您可以创建方法检查以查看传递的对象是否实现该接口。