我有一个包含产品 的数据库。 这些产品经过分类,具有类别和子类别。
例如:
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/