2013-10-24 247 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,所以它不能被继承。