2014-03-04 118 views
0

背景:設置基於國家枚舉一個子狀態枚舉

讓我們看一個項目的例子被列在一個電子商務網站來解釋這個問題。也許你有自行車出售,並且你試圖在銷售網站上列出它,選擇一個類別和子類別。也許你會選擇:

(類別>子類別) 車輛>自行車

的類別和子類別。可以理解的是,車輛類別有其獨特的子類別。

問:

我有一類下面的代碼:

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

    public enum Category { 
     Vehicles, 
     Guitars, 
     ExoticAnimals 
    } 
} 

我怎樣才能讓類型選擇取決於所選擇的類別,如在後臺的例子嗎? 如果解決方案有效,我很高興不要使用枚舉。

+0

你在做什麼?向我們展示你的代碼 – alexmac

+2

我不認爲類別通常是一個很好的候選者。如果您添加類別,那麼您將需要重新編譯通常不好的代碼。另外我會想象你通常不希望在很多類別之間編譯時間差異。通常我會在數據庫中有一個類別和子類別的表,然後在其結構中內置依賴關係。 – Chris

+0

您可以使用一個名爲Subcategory的類,該類包含Category作爲屬性。 (就像'class Subcategory {public Category Category {get; set;}}',使用Subcategory作爲你的Listing類中唯一的屬性) – Diamondo25

回答

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

我建議如下結構:

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)