2013-10-24 222 views
1

這是我的問題。在public class Item把這些enum對象:根據之前選擇的枚舉值選擇枚舉

public enum Category { 
    FirstCategory, 
    SecondCategory, 
    ThirdCategory 
} 

一旦enum值選擇,我想與價值名稱中使用它,然後找到子類別內的另一個enum

public enum FirstCategory { 
    FirstCategoryA, 
    FirstCategoryB, 
    FirstCategoryC 
} 

我會喜歡能夠從這些值中設置兩個屬性,CategorySubcategory,但最重要的是我想要一個簡單的句法方式來首先設置Item.Category,並從所選的值中選擇哪個enumItem.Subcategory可以,像這樣(僞代碼)進行選擇:

Item item = new Item(); 
item.Category = Item.Category.FirstCategory; 
item.Subcategory = // enum for subcategory choices based on item.Category value 

注:不必在所有這樣的工作。任何其他建議可以更好地從集合中選擇一個值,然後根據此基礎爲子類別的集合建立基礎。

感謝您的幫助!

+1

[嵌套枚舉的替代方法]的可能重複(http://stackoverflow.com/questions/19547833/alternative-to-nesting-enums)@尼克,這與您之前發佈的問題有何不同? – Harrison

+2

您已經標記了[Servy的答案](http://stackoverflow.com/a/19548179/2145211)作爲解決您的問題 – Harrison

+0

我真的希望能夠選擇'enum'基於'Category'選擇的名稱,也許我對Servy的回答能夠做到這一點並不敏感。主要區別在於語法;我不太需要語法'Item.Category.Subcategory',我更喜歡'Item.Category',然後根據它的選擇將可能的選項'Item.Subcategory'建立 - 這就是我遇到的麻煩 –

回答

0

我會改變枚舉由一個類來表示

public class Category 
{ 
    public string CategoryName {get; set;} 
    public List<Category> SubCategories {get; set;} 
} 

然後使用它是這樣的:

var availableCategories = new List<Category> 
      { 
       new Category 
        { 
         CategoryName = "FirstCategory", 
         SubCategories = new List<Category>() 
          { 
           new Category {CategoryName = "FirstCategoryA"}, 
           new Category {CategoryName = "FirstCategoryB"}, 
           new Category {CategoryName = "FirstCategoryC"} 
          } 
        }, 
       new Category 
        { 
         CategoryName = "SecondCategory", 
         SubCategories = new List<Category>() 
          { 
           new Category {CategoryName = "SecondCategoryA"}, 
           new Category {CategoryName = "SecondCategoryB"}, 
           new Category {CategoryName = "SecondCategoryC"} 
          } 
        } 
      }; 

     var availableCategoryNames = availableCategories.Select(a => a.CategoryName); 
     var selectedCategory = availableCategoryNames.First(); 
     var availableSubCategories = availableCategories.Where(a => a.CategoryName == selectedCategory) 
                 .SelectMany(c => c.SubCategories) 
                 .Select(s => s.CategoryName); 

顯然你想要改變你的選擇你的類別,但這應該給你一個大概的想法。你可以填充你的類別,但是你想要的 - 硬編碼(yuck),一些資源文件(meh),或者存儲在某個數據庫(我的首選項,如果合理的話)。另外,如果你需要「子子類別」,你已經有了管道。

如果你願意,你也可以使你的分類類sealed,所以它不能被繼承。