C#,迭代通用子类的公共父类

时间:2014-06-03 18:54:09

标签: c# class generics foreach ienumerable

我如何设置以下类,以便我可以使用一个公共父类/接口的方法,并允许我迭代任何子节点而不指定泛型类型?

public abstract class BaseClass
{ ??? }

public class ChildClass<T> : BaseClass 
{
    public List<T> SomeList;
            ???
}

ChildClass<int> childA = new ChildClass<int> ();
ChildClass<string> childB = new ChildClass<string> ();

public void IterateOverChild (BaseClass someChildClass)
{
    foreach (var element in someChildClass.SomeList)    
    {
        Console.WriteLine (element);
    }

}

3 个答案:

答案 0 :(得分:6)

让抽象类暴露一些访问子类之间通用数据的方法,在这种情况下,是一个数据序列,其中每个对象可以是任何类型:

public abstract class BaseClass
{
    public abstract IEnumerable Data { get; }
}

public class ChildClass<T> : BaseClass
{
    public List<T> SomeList { get; set; }
    public override IEnumerable Data { get { return SomeList; } }
}

答案 1 :(得分:2)

使用

public abstract class BaseClass<T>
{
    public List<T> SomeList { get; set; }

}

public class ChildClass<T> : BaseClass<T>
{

}

public void IterateOverChild<T>(BaseClass<T> someChildClass)
{
    foreach (var element in someChildClass.SomeList)
    {
        Console.WriteLine(element);
    }
}

答案 2 :(得分:0)

除非BaseClass知道<T>,否则它不能包含T类型的任何属性或方法。但是,您可以提供一个基本实现,至少公开您的属性的非泛型形式。您丢失了类型信息但保留了可枚举性。

public abstract class BaseClass
{
    public IList SomeList { get; set; }
}

public class ChildClass<T> : BaseClass 
{
    public new List<T> SomeList
    {
        get { return (List<T>) base.SomeList; }
        set { base.SomeList = value; }
    }
}