1

定義したクラスがあり、それから派生した子クラスがいくつかあります。親クラスには列挙型があります(これを「Barf」と呼びましょう)。各子孫にも同じ名前の列挙型がありますが、同じ値ではありません。私がその方法を理解しようとしているのは、インスタンス化されたオブジェクトの実際のクラスのBarfのバージョンを取得する祖先クラスのメソッドを作成することです。したがって、Ancestorのインスタンスを作成する場合は、このメソッドでAncestor.Barfのエントリを処理する必要があります。Ancestorの子クラスの1つのインスタンスを作成する場合、メソッドにChildx.Barf値を処理させたいと思います。

明らかに、これはリフレクションソリューションになりますが、私のリフレクションスキルはかなりまばらです。何か助けはありますか?

4

1 に答える 1

0

それを楽しむために、ここに可能なアプローチがあります:

public class Ancestor {
    public enum Caffeine {
        Tea,
        Coffee
    }

    public void ProcessValues() {
        var type = GetType();
        var nestedEnums = from t in type.GetNestedTypes()
                          where t.IsEnum
                          select t;
        var nestedEnum = nestedEnums.Single();
        foreach(var val in Enum.GetValues(nestedEnum)) {
            Console.WriteLine("Drinking {0}", val);
        }
    }
}

public class Descendant : Ancestor {
    public new enum Caffeine {
        Jolt,
        RedBull
    }
}

// The following prints:
// Drinking Jolt
// Drinking RedBull
Ancestor x = new Descendant();
x.ProcessValues();

もちろん、ポリモーフィズムを使用して同じことを達成できます。

public class Ancestor {
    public enum Caffeine {
        Tea,
        Coffee
    }

    protected virtual Type GetNestedEnum() {
        return typeof(Ancestor.Caffeine);
    }

    public void ProcessValues() {
        var nestedEnum = GetNestedEnum();

        foreach(var val in Enum.GetValues(nestedEnum)) {
            Console.WriteLine("Drinking {0}", val);
        }
    }
}

public class Descendant : Ancestor {
    public new enum Caffeine {
        Jolt,
        RedBull
    }

    protected override Type GetNestedEnum() {
        return typeof(Descendant.Caffeine);
    }
}

ただし、Justin Morganが指摘しているように、このような構造が必要な場合は、コードの根本的な設計上の問題を示している可能性があります。

于 2012-12-08T01:11:53.530 に答える