gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:18:56 37 4
gpt4 key购买 nike

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

例如:

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/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com