使用c#中的枚举获取每个类别下的所有类型

时间:2014-07-18 10:38:48

标签: c# enums

我有2个枚举

 enum Categories{
        Entertainment=100,
        Food=200,
        Medical=300
        };


 enum Types
        {
            Multiplex = 101,
            GameZone,
            Bar = 201,
            Hotel,
            Cafe,
            Hospital = 301,
            Clinic 
        };

我想列出特定类别下的所有类型 例如。 如果我给娱乐作为输入输出列表将包含Multiplex和Gamezone

我该怎么做?

3 个答案:

答案 0 :(得分:3)

首先,这看起来像一个非常糟糕的设计。你有隐含的关系,而不是明确的关系(即字典或类似的类型明确表示什么与什么相关)。

我会认真考虑找一种不同的方式来组织这些事情。

但是,尽管如此,这是获得类型的一种方法:

var cat = Categories.Entertainment;

var types =
    from Types type in Enum.GetValues(typeof(Types))
    where (int)type >= (int)cat && (int)type < (int)cat+100
    select type;

答案 1 :(得分:3)

我建议你为你使用字典,如下所示:

Dictionary<Categories,List<Types>> dictionary = new Dictionary<Categories, List<Types>>()
{
    { Categories.Entertainment, new List<Types> { Types.Multiplex , Types.GameZone} },
    { Categories.Food, new List<Type> { Types.Bar, Types.Hotel, Types.Cafe }}
};

这样你可以检索相应的列表,给出正确的键,如下所示:

dictionary[Categories.Entertainment]

将返回包含元素的列表

Types.MultiplexTypes.GameZone

答案 2 :(得分:2)

我建议使用将其指向类别的自定义属性来修饰类型枚举值。

我知道你已经放入了范围值,但我的偏好是自定义属性。

实施例

使用属性

public class CategoryAttribute : Attribute
    {
        private readonly Category _category;

        public Category Category
        {
            get
            {
                return _category;
            }
        }

        public CategoryAttribute(Category category)
        {
            _category = category;
        }
    }

您可以使用与

类似的方法
public static Category GetCateogryFromType(Types categoryType)
        {
            var memberInfo = typeof(Types).GetMember(categoryType.ToString())
                                                      .FirstOrDefault();

            if (memberInfo != null)
            {
                var attribute = (CategoryAttribute)memberInfo.GetCustomAttributes(typeof(CategoryAttribute), false).FirstOrDefault();
                if (attribute != null)
                {
                    return attribute.Category;
                }
            }

            throw new ArgumentException("No category found");
        }

        public static IEnumerable<Types> GetCategoryTypes(Category category)
        {
            var values = Enum.GetValues(typeof(Types)).Cast<Types>();
            return values.Where(t => GetCateogryFromType(t) == category);
        }

然后装饰你的类型

public enum Types
    {
        [Category(Category.Entertainment)]
        Multiplex,
        [Category(Category.Entertainment)]
        GameZone,
        [Category(Category.Food)]
        Bar,
        [Category(Category.Food)]
        Hotel,
        [Category(Category.Food)]
        Cafe,
        [Category(Category.Medical)]
        Hospital,
        [Category(Category.Medical)]
        Clinic
    }

然后你可以打电话

GetCategoryTypes(Category.Entertainment).ToList();

哦,我将您的类别枚举重命名为Category :-p