2019-07-21 17:06

C# 在 Enum 上增加附加資訊

C# 的 Enum 是個很方便的類型,如果可以再增加額外的資訊就更方便了,這裡利用 Attribute 去定義 Enum 額外的資訊,再用擴充方法取得 Enum 所屬的資訊。

用 Attribute 來定義有個好處,未來在增減 Enum 時可以一起進行修改,不用擔心會有遺漏而沒修改的問題。

  1. void Main() 
  2. { 
  3.    PortAreaCode.F1Front.GetFloor().Dump(); /* F1 */ 
  4. } 
  5.  
  6.  
  7. public enum PortAreaCode 
  8. { 
  9.    [AreaMeta("None", 0)] 
  10.    None, 
  11.  
  12.    [AreaMeta("F1", 1)] 
  13.    F1Front, 
  14.  
  15.    [AreaMeta("F2", 1)] 
  16.    F2Front, 
  17. } 
  18.  
  19.  
  20.  
  21. /// <summary>PortAreaCode 額外附屬資訊定義的 Attribute</summary> 
  22. [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)] 
  23. class AreaMetaAttribute : Attribute 
  24. { 
  25.    public string Floor { get; private set; } 
  26.    public int WarehouseId { get; private set; } 
  27.  
  28.    public AreaMetaAttribute() : this("None", 0) { } 
  29.  
  30.    public AreaMetaAttribute(string floor, int warehouseId) 
  31.    { 
  32.        Floor = floor; 
  33.        WarehouseId = warehouseId; 
  34.    } 
  35. } 
  36.  
  37.  
  38.  
  39. /// <summary>PortAreaCode 的擴充方法</summary> 
  40. public static class PortAreaCodeExtensions 
  41. { 
  42.    private static AreaMetaAttribute _defaultMeta = new AreaMetaAttribute(); 
  43.  
  44.    private static AreaMetaAttribute getMeta(PortAreaCode value) 
  45.    { 
  46.        FieldInfo field = typeof(PortAreaCode).GetField(value.ToString()); 
  47.        if(field == null) { return _defaultMeta; } 
  48.  
  49.        var meta = field.GetCustomAttribute<AreaMetaAttribute>(); 
  50.        return meta ?? _defaultMeta; 
  51.    } 
  52.  
  53.    public static string GetFloor(this PortAreaCode value) 
  54.    { 
  55.        return getMeta(value).Floor; 
  56.    } 
  57.  
  58.    public static int GetWarehouseId(this PortAreaCode value) 
  59.    { 
  60.        return getMeta(value).WarehouseId; 
  61.    } 
  62. } 

0 回應: