Method返回超类而不是子类的列表

时间:2013-04-21 12:27:01

标签: c# inheritance casting type-conversion subclass

我有class X代表一个元素。类ABCD是此类的子类,并为元素添加其他行为。

我的enum ElementType值为TypeATypeBTypeCTypeD

在我目前的情况中,有一个class Y,其中包含X类型的集合,并且有一个method GetElementsByType(ElementType type)

调用此方法时,我想根据类型返回列表中每个项目的列表。

在我的第一次尝试中,我最终得到了这个,但这导致了超类和子类之间的转换错误。

public List<X> GetElementsByType(ElementType type) {
        switch (type) {
            case ElementType.TypeA:
                return Elementen.OfType<A>().ToList();
            case ElementType.TypeB:
                return Elementen.OfType<B>().ToList();
            case ElementType.TypeC:
                return Elementen.OfType<C>().ToList();
            case ElementType.TypeD:
                return Elementen.OfType<D>().ToList();
            default:
                throw new ArgumentException();
        }
    }

在我的第二次尝试中,我尝试通过使每个子类实现一个应该避免转换错误的公共接口来避免这种转换。

我最终得到了这个:

public interface IElement {
}

A : X, IElement
B : X, IElement
C : X, IElement
D : X, IElement


public List<IElement> GetElementsByType(ElementType type) {
            switch (type) {
                case ElementType.TypeA:
                    return new List<IElement>(Elementen.OfType<A>().ToList());
                case ElementType.TypeB:
                    return new List<IElement>(Elementen.OfType<B>().ToList());
                case ElementType.TypeC:
                    return new List<IElement>(Elementen.OfType<C>().ToList());
                case ElementType.TypeD:
                    return new List<IElement>(Elementen.OfType<D>().ToList());
                default:
                    throw new ArgumentException();
            }
        }

但是,当我从某个地方调用此方法时,例如,

var result = obj.GetElementsByType(ElementType.TypeA).FirstOfDefault(a => a.PropX == variable)

我注意到lambda表达式无法检索Element中的任何属性,而是保留了IElement中定义的所有内容(无)。

如何解决这个问题,以便我可以调用单个方法,添加枚举作为参数,并从定义为超类的单个List返回Collection个子类?

1 个答案:

答案 0 :(得分:4)

你可以这样做更简单:

public List<T> GetElementsByType<T>() where T : X
{  
        return Elementen.OfType<T>().ToList();
}