背景
我们以电子商务网站上列出的项目为例来解释这个问题。也许你有一辆待售的自行车,你试图在销售网站上列出它,同时选择一个类别和子类别。也许你可以选择:
(类别>子类别) 车辆>自行车
作为类别和子类别。可以理解的是,车辆类别有自己独特的子类别。
问题:
我有一个类的以下代码:
public class Listing
{
public Category ListingCategory { get; set; }
public Subcategory ListingSubcategory { get; set; }
public enum Category {
Vehicles,
Guitars,
ExoticAnimals
}
}
如何允许子类别选择依赖于所选类别,例如在后台示例中? 如果解决方案有效,我很高兴不使用枚举!
答案 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)