C#:Enum反模式

前端之家收集整理的这篇文章主要介绍了C#:Enum反模式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有人一直在谈论Enums一般违反清洁守则原则,所以我正在寻找人们最喜欢的Enum反模式和替代解决方案.

例如,我见过这样的代码

  1. switch(enumValue) {
  2. case myEnum.Value1:
  3. // ...
  4. break;
  5. case myEnum.Value2:
  6. // ...
  7. break;
  8. }

它比带有魔术字符串的switch语句更好一步,但这可能已经通过工厂,容器或其他模式更好地解决了.

甚至像这样的老派代码

  1. if(enumValue == myEnum.Value1) {
  2. // ...
  3. } else if (enumValue == myEnum.Value2) {
  4. // ...
  5. }

您对枚举有哪些其他反模式和更好的实现?

解决方法

我认为Enums非常有用.我为Enum写了一些扩展,为它的使用增加了更多的价值

首先,有Description扩展方法

  1. public static class EnumExtensions
  2. {
  3. public static string Description(this Enum value)
  4. {
  5. var entries = value.ToString().Split(ENUM_SEPERATOR_CHARACTER);
  6. var description = new string[entries.Length];
  7. for (var i = 0; i < entries.Length; i++)
  8. {
  9. var fieldInfo = value.GetType().GetField(entries[i].Trim());
  10. var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute),false);
  11. description[i] = (attributes.Length > 0) ? attributes[0].Description : entries[i].Trim();
  12. }
  13. return String.Join(",",description);
  14. }
  15. private const char ENUM_SEPERATOR_CHARACTER = ',';
  16. }

这将允许我像这样定义en enum:

  1. public enum MeasurementUnitType
  2. {
  3. [Description("px")]
  4. Pixels = 0,[Description("em")]
  5. Em = 1,[Description("%")]
  6. Percent = 2,[Description("pt")]
  7. Points = 3
  8. }

并通过这样做得到标签:var myLabel = rectangle.widthunit.Description()(不需要switch语句).

如果rectangle.widthunit = MeasurementUnitType.Pixels,它将返回“px”,如果rectangle.widthunit = MeasurementUnitType.Pixels,它将返回“px,em” MeasurementUnitType.Em.

然后,有一个

  1. public static IEnumerable<int> GetIntBasedEnumMembers(Type @enum)
  2. {
  3. foreach (FieldInfo fi in @enum.GetFields(BindingFlags.Public | BindingFlags.Static))
  4. yield return (int)fi.GetRawConstantValue();
  5. }

这将让我遍历任何基于int的值的枚举并返回int值本身.

我发现这些在一个已经有用的概念中非常有用.

猜你在找的C#相关文章