1

要素をclass X表す があります。クラスABCおよびDは this のサブクラスであり、要素に追加の動作を追加します。

、、およびのenum ElementType値があります。TypeATypeBTypeCTypeD

私の現在のシナリオでは、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

4

1 に答える 1

4

これをもう少し簡単に行うことができます:

public List<T> GetElementsByType<T>() where T : X
{  
        return Elementen.OfType<T>().ToList();
}
于 2013-04-21T12:31:34.060 に答える