用 Attribute 來定義有個好處,未來在增減 Enum 時可以一起進行修改,不用擔心會有遺漏而沒修改的問題。
void Main() { PortAreaCode.F1Front.GetFloor().Dump(); /* F1 */ } public enum PortAreaCode { [AreaMeta("None", 0)] None, [AreaMeta("F1", 1)] F1Front, [AreaMeta("F2", 1)] F2Front, } /// <summary>PortAreaCode 額外附屬資訊定義的 Attribute</summary> [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)] class AreaMetaAttribute : Attribute { public string Floor { get; private set; } public int WarehouseId { get; private set; } public AreaMetaAttribute() : this("None", 0) { } public AreaMetaAttribute(string floor, int warehouseId) { Floor = floor; WarehouseId = warehouseId; } } /// <summary>PortAreaCode 的擴充方法</summary> public static class PortAreaCodeExtensions { private static AreaMetaAttribute _defaultMeta = new AreaMetaAttribute(); private static AreaMetaAttribute getMeta(PortAreaCode value) { FieldInfo field = typeof(PortAreaCode).GetField(value.ToString()); if(field == null) { return _defaultMeta; } var meta = field.GetCustomAttribute<AreaMetaAttribute>(); return meta ?? _defaultMeta; } public static string GetFloor(this PortAreaCode value) { return getMeta(value).Floor; } public static int GetWarehouseId(this PortAreaCode value) { return getMeta(value).WarehouseId; } }
沒有留言:
張貼留言
你好!歡迎你在我的 Blog 上留下你寶貴的意見。