要素をclass X
表す があります。クラスA
、B
、C
およびD
は this のサブクラスであり、要素に追加の動作を追加します。
、、およびのenum ElementType
値があります。TypeA
TypeB
TypeC
TypeD
私の現在のシナリオでは、class Y
型の Collection を保持し、 を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();
}
}
2 回目の試行では、変換エラーを回避する共通のインターフェイスを各サブクラスに実装させることで、この変換を回避しようとしました。
私はこれで終わった:
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)
ラムダ式が からプロパティを取得できず、Element
代わりに IElement 内で定義されたすべて (何もない) が残っていることに気付きました。
これを修正して、単一のメソッドを呼び出し、パラメーターとして列挙型を追加し、スーパークラスとして定義されList
た単一からサブクラスを返すことができるようにするにはどうすればよいですか?Collection