c# - 将枚举映射到 "sub-enum"

标签 c# .net enums

我有一个包含产品 的数据库。 这些产品经过分类,具有类别子类别

例如:

Product p1 = new Product()
{ 
    Category = Category.Fruit, 
    Subcategory = Subcategory.Apple 
 };

我的问题是我想根据类别限制子类别。

下面的例子应该是不可能的:

Product p2 = new Product()
{ 
    Category = Category.Fruit, 
    Subcategory = Subcategory.Cheese 
};

此外,我希望能够返回一个字符串数组(匹配每个类别枚举),每个字符串都有一个相应子类别的数组。

想了半天没有想到,网上也没有找到解决办法。

有什么建议?

最佳答案

我喜欢 map 规则。 您还可以在枚举值上放置自定义属性。

例如:

public enum Subcategory {
    [SubcategoryOf(Category.Fruit)]
    Apple,
    [SubcategoryOf(Category.Dairy)]
    Emmenthaler
}

这需要您编写一个 SubcategoryOfAttribute 类(请参阅 here 以获取 MS 指南)。然后您可以编写一个验证器,它可以查看任何子类别并从中获取合法的父类别。

与 map 相比,这样做的好处是在声明中很好地阐明了这种关系。

缺点是每个子类最多只能有一个父类。

我觉得这很有趣,所以我把它删掉了。首先是属性:

[AttributeUsage(AttributeTargets.Field)]
public class SubcategoryOf : Attribute {
    public SubcategoryOf(Category cat) {
        Category = cat;
    }
    public Category Category { get; private set; }
}

然后我们做一些模拟枚举

public enum Category {
    Fruit,
    Dairy,
    Vegetable,
    Electronics
}

public enum Subcategory {
    [SubcategoryOf(Category.Fruit)]
    Apple,
    [SubcategoryOf(Category.Dairy)]
    Buttermilk,
    [SubcategoryOf(Category.Dairy)]
    Emmenthaler,
    [SubcategoryOf(Category.Fruit)]
    Orange,
    [SubcategoryOf(Category.Electronics)]
    Mp3Player
}

现在我们需要一个谓词来确定一个子类别是否匹配一个类别(注意:如果你愿意,你可以有多个父类别 - 你需要修改属性和这个谓词以获取所有属性和检查每一个。

public static class Extensions {
    public static bool IsSubcategoryOf(this Subcategory sub, Category cat) {
        Type t = typeof(Subcategory);
        MemberInfo mi = t.GetMember(sub.ToString()).FirstOrDefault(m => m.GetCustomAttribute(typeof(SubcategoryOf)) != null);
        if (mi == null) throw new ArgumentException("Subcategory " + sub + " has no category.");
        SubcategoryOf subAttr = (SubcategoryOf)mi.GetCustomAttribute(typeof(SubcategoryOf));
        return subAttr.Category == cat;
    }
}

然后你输入你的产品类型来测试它:

public class Product {
    public Product(Category cat, Subcategory sub) {
        if (!sub.IsSubcategoryOf(cat)) throw new ArgumentException(
            String.Format("{0} is not a sub category of {1}.", sub, cat), "sub");
        Category = cat;
        Subcategory = sub;
    }

    public Category Category { get; private set; }
    public Subcategory Subcategory { get; private set; }
}

测试代码:

Product p = new Product(Category.Electronics, Subcategory.Mp3Player); // succeeds
Product q = new Product(Category.Dairy, Subcategory.Apple); // throws an exception

关于c# - 将枚举映射到 "sub-enum",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26472062/

相关文章:

c# - 在 Visual Studio 中更改 AWS CloudFormation 发布的解决方案配置

c# - ASP.NET 页面性能

java枚举中的重复代码

c++ - 使用constexpr返回函数值C++的模板函数调用

java - 使用泛型作为参数并访问特定枚举的方法

c# - 使用 C# 获取以毫秒为单位的时间

c# - 对象集合的 FirstOrDefault

c# - WPF c# webbrowser 在顶部菜单上滚动

c# - 无法加载文件或程序集 'Microsoft.AI.Agent.Intercept' 或其依赖项之一

c# - 为什么我的 OrderBy 使用这个比较器永远运行?