我有一个class X
代表一个元素。类A
、和是 this 的子类,并为元素添加额外的行为B
。C
D
我有一个enum ElementType
with values TypeA
, TypeB
, TypeC
and TypeD
。
在我目前的情况下,有一个class Y
包含类型的 CollectionX
并且有一个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