5

enumsの構文を与えるようなものをいくつか作成しようとしていますDropdown.Category.Subcategory。しかし、これはあまり良い考えではないことを読んでいます。これを選択した主な理由は、カテゴリの選択に応じて異なる値を選択する他の方法を考えられなかったためです。enumサブカテゴリの選択はenum、値に基づいて選択されenumます。

そのような機能を作成するより良い方法はありますか? .Categoryと の両方の名前を簡単に識別できるように.Subcategoryしたいと考えています。このコードが判読可能であればなおさらです。

明確にするために、 を選択しCategoryて、適切なSubcategory選択ができるようにしたいと考えています。

public class Dropdown
{
    public enum Gifts
    {
        GreetingCards,
        VideoGreetings,
        UnusualGifts,
        ArtsAndCrafts,
        HandmadeJewelry,
        GiftsforGeeks,
        PostcardsFrom,
        RecycledCrafts,
        Other
    }
    public enum GraphicsAndDesign 
    {
        CartoonsAndCaricatures,
        LogoDesign,
        Illustration,
        EbookCoversAndPackages,
        WebDesignAndUI,
        PhotographyAndPhotoshopping,
        PresentationDesign,
        FlyersAndBrochures,
        BusinessCards,
        BannersAndHeaders,
        Architecture,
        LandingPages,
        Other
    }
}
4

1 に答える 1

4

外部から継承できないクラスを作成し、いくつかの内部クラスを与え、それぞれがそこから拡張します。次に、表現する値ごとに読み取り専用の静的変数を追加します。

public class Dropdown
{
    private string value;

    //prevent external inheritance
    private Dropdown(string value)
    {
        this.value = value;
    }

    public class Gifts : Dropdown
    {
        //prevent external inheritance
        private Gifts(string value) : base(value) { }

        public static readonly Dropdown GreetingCards =
            new Gifts("GreetingCards");
        public static readonly Dropdown VideoGreetings =
            new Gifts("VideoGreetings");
        public static readonly Dropdown UnusualGifts =
            new Gifts("UnusualGifts");
        public static readonly Dropdown ArtsAndCrafts =
            new Gifts("ArtsAndCrafts");
    }
    public class GraphicsAndDesign : Dropdown
    {
        //prevent external inheritance
        private GraphicsAndDesign(string value) : base(value) { }

        public static readonly Dropdown CartoonsAndCaricatures =
            new GraphicsAndDesign("CartoonsAndCaricatures");
        public static readonly Dropdown LogoDesign =
            new GraphicsAndDesign("LogoDesign");
        public static readonly Dropdown Illustration =
            new GraphicsAndDesign("Illustration");
    }

    public override string ToString()
    {
        return value;
    }
}

この場合、すべての単一の値は実際には type のインスタンスであるDropdownため、たとえば、インスタンスを受け入れるメソッドへのパラメーターを持つことができDropdownます。Dropdown列挙型では、「クラスで宣言された列挙型のいずれかを受け入れたい」と言う方法はありません。

使用例を次に示します。

public static void UseDropdown(Dropdown type)
{
    if (type is Dropdown.Gifts)
    {
        if (type == Dropdown.Gifts.GreetingCards)
        {
            DoStuff();

        }
    }
    else if (type is Dropdown.GraphicsAndDesign)
    {
    }
}

サブタイプを特定のコンテキストでのみ有効にしたい場合は、タイプGiftsorのオブジェクトを受け入れるパラメータを持つこともできます。GraphicsAndDesign

残念ながら、このソリューションを使用switchしてドロップダウン値を取得する良い方法はありません。if/else ifチェーンを使用して値を確認するだけです。

インスタンス文字列値の使用は必須ではないかもしれませんが (それがないバージョンについては最初のリビジョンを参照してください)、意味のある文字列値 (または他の種類の値; 整数を関連付けることができます) を持つことができると非常に役立ちます。バイト、または各列挙値を持つもの)。

EqualsとのGetHashCode実装は、オーバーライドせずにそのままにしておけば意味があるはずです。

IComparable実際の列挙型のように、アイテムを論理的に順序付けする必要がある場合は実装できます。

于 2013-10-23T17:16:31.683 に答える