根据State枚举设置Substate枚举

时间:2014-03-04 14:14:06

标签: c# enums

背景

我们以电子商务网站上列出的项目为例来解释这个问题。也许你有一辆待售的自行车,你试图在销售网站上列出它,同时选择一个类别和子类别。也许你可以选择:

(类别>子类别) 车辆>自行车

作为类别和子类别。可以理解的是,车辆类别有自己独特的子类别。

问题:

我有一个类的以下代码:

public class Listing 
{
    public Category ListingCategory { get; set; }
    public Subcategory ListingSubcategory { get; set; }

    public enum Category {
        Vehicles,
        Guitars,
        ExoticAnimals
    }
}

如何允许子类别选择依赖于所选类别,例如在后台示例中? 如果解决方案有效,我很高兴不使用枚举!

2 个答案:

答案 0 :(得分:2)

您可以使用表示子类别的抽象类。它将在其Ctor中获得该类别,并将在类别和子类别项列表之间维护静态映射。

SubcategoryItem可以保存您从任何单个子类别项目中获得的所有功能(如果有的话)。

public class SubcategoryItem
{
    public string Name { get; set; }
    public Action WhatItDoes { get; set; }

    public SubcategoryItem(string name, Action trick)
    {
        Name = name;
        WhatItDoes = trick;
    }
}

public abstract class AbsSubcategory
{
    private static readonly IDictionary<Category, IList<SubcategoryItem>> mCategoriesMap = new Dictionary<Category, IList<SubcategoryItem>>();

    public abstract IList<SubcategoryItem> Subcategories { get; }

    protected AbsSubcategory(Category cat)
    {
        if (Subcategories != null) mCategoriesMap[cat] = Subcategories;
    }
}

public class VehiclesSubcategory : AbsSubcategory
{
    private static readonly IList<SubcategoryItem> mSubcategories;
    public override IList<SubcategoryItem> Subcategories
    {
        get { return mSubcategories; }
    }

    static VehiclesSubcategory()
    {
        mSubcategories = new List<SubcategoryItem>()
        {
            new SubcategoryItem("Bikes", () => { /* Do something */ } ),
            new SubcategoryItem("Cars", () => { /* Do something */ } ),
        };
    }

    public VehiclesSubcategory()
        : base(Category.Vehicles)
    {
    }
}

答案 1 :(得分:1)

我建议遵循以下结构:

  public class Category {
    public int CategoryID { get; set; }
    public string CategoryName { get; set; }

    public Category Parent { get; set; }
    public IList<Category> Children { get; set; }
  }

在数据库中:

create table Categories (
   CategoryID int primary key not null identity(1,1),
   CategoryName nvarchar(50),
   ParentCategoryID int NULL
)

alter table Categories 
add constraint FK_Categories_ParentCategoryID
foreign key (ParentCategoryID)
references Categories(CategoryID)