我正在尝试创建几个enums,这给出了语法Dropdown.Category.Subcategory.但是,我一直在读,这不是一个好主意.我对此的选择主要是因为enum根据类别的选择,我想不出任何其他方式来选择不同的值,然后子类别的选择取决于enum基于enum值的选择.
有没有更好的方法来创建这样的功能?我希望能够轻松识别名称.Category和.Subcategory名称,如果此代码可读,这将是一个奖励.
为了说清楚,我希望能够选择Category,然后有适当的Subcategory选择.
public class Dropdown
{
public enum Gifts
{
GreetingCards,
VideoGreetings,
UnusualGifts,
ArtsAndCrafts,
HandmadeJewelry,
GiftsforGeeks,
PostcardsFrom,
RecycledCrafts,
Other
}
public enum GraphicsAndDesign
{
CartoonsAndCaricatures,
LogoDesign,
Illustration,
EbookCoversAndPackages,
WebDesignAndUI,
PhotographyAndPhotoshopping,
PresentationDesign,
FlyersAndBrochures,
BusinessCards,
BannersAndHeaders,
Architecture,
LandingPages,
Other
}
}
Run Code Online (Sandbox Code Playgroud)
创建一个不能从外部继承的类,给它几个内部类,每个内部类都从它扩展。然后为您想要表示的每个值添加静态只读变量:
public class Dropdown
{
private string value;
//prevent external inheritance
private Dropdown(string value)
{
this.value = value;
}
public class Gifts : Dropdown
{
//prevent external inheritance
private Gifts(string value) : base(value) { }
public static readonly Dropdown GreetingCards =
new Gifts("GreetingCards");
public static readonly Dropdown VideoGreetings =
new Gifts("VideoGreetings");
public static readonly Dropdown UnusualGifts =
new Gifts("UnusualGifts");
public static readonly Dropdown ArtsAndCrafts =
new Gifts("ArtsAndCrafts");
}
public class GraphicsAndDesign : Dropdown
{
//prevent external inheritance
private GraphicsAndDesign(string value) : base(value) { }
public static readonly Dropdown CartoonsAndCaricatures =
new GraphicsAndDesign("CartoonsAndCaricatures");
public static readonly Dropdown LogoDesign =
new GraphicsAndDesign("LogoDesign");
public static readonly Dropdown Illustration =
new GraphicsAndDesign("Illustration");
}
public override string ToString()
{
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,每个值实际上都是 type 的一个实例Dropdown,因此您可以拥有一个接受实例的方法的参数Dropdown。对于枚举,无法说“我想接受类中声明的任何枚举Dropdown”。
这是一些示例用法:
public static void UseDropdown(Dropdown type)
{
if (type is Dropdown.Gifts)
{
if (type == Dropdown.Gifts.GreetingCards)
{
DoStuff();
}
}
else if (type is Dropdown.GraphicsAndDesign)
{
}
}
Run Code Online (Sandbox Code Playgroud)
如果您只希望子类型在某些上下文中有效,您还可以有一个接受类型Gifts或 的对象的参数。GraphicsAndDesign
遗憾的是,使用此解决方案没有好的方法来switch设置下拉值;您必须只使用if/else if链来检查值。
可能不需要使用实例字符串值(请参阅没有它的版本的第一个修订版),但是能够拥有有意义的字符串值(或其他类型的值;您可以关联一个整数,一个字节,或者每个枚举值的任何内容)。
如果不被覆盖, Equals和实现应该是有意义的。GetHashCode
您可以实现IComparable项目是否应该以某种方式按逻辑顺序排序,例如真正的枚举。