C#如何通过Enum枚举将Guid映射为饮品名称并拼接为字符串
实现方案
注意:C# 枚举不支持直接使用 Guid 作为成员名(枚举成员名必须为合法标识符,不允许包含连字符),因此我们通过「自定义属性 + 扩展方法」的方式实现映射需求。
1. 定义Guid映射自定义属性
/// <summary> /// 饮品枚举绑定Guid的自定义属性 /// </summary> public class DrinkGuidAttribute : Attribute { public Guid Guid { get; } public DrinkGuidAttribute(string guid) { Guid = Guid.Parse(guid); } }
2. 定义饮品枚举
按你需要的映射关系给每个枚举成员绑定Display(存饮品名)和DrinkGuid(存对应Guid)即可:
using System.ComponentModel.DataAnnotations; public enum Drinks { [Display(Name = "Vodka")] [DrinkGuid("642E1905-1111-EC11-9FFF-00155E011509")] Vodka, // 剩下的Guid依次补充对应枚举项即可,示例: [Display(Name = "Whiskey")] [DrinkGuid("652E1905-1111-EC11-9FFF-00155E011509")] Whiskey, [Display(Name = "Rum")] [DrinkGuid("662E1905-1111-EC11-9FFF-00155E011509")] Rum // 剩余15个Guid按上述格式自行补充对应饮品名称即可 }
3. 编写Guid转饮品名的扩展方法
using System.Reflection; using System.ComponentModel.DataAnnotations; public static class DrinksExtension { // 预缓存映射关系避免每次反射,提升性能 private static readonly Dictionary<Guid, string> _drinkMapping = new Dictionary<Guid, string>(); static DrinksExtension() { // 程序启动时一次性加载所有映射关系 var enumType = typeof(Drinks); foreach (var field in enumType.GetFields(BindingFlags.Public | BindingFlags.Static)) { var guidAttr = field.GetCustomAttribute<DrinkGuidAttribute>(); var displayAttr = field.GetCustomAttribute<DisplayAttribute>(); if (guidAttr != null && displayAttr != null) { _drinkMapping[guidAttr.Guid] = displayAttr.Name; } } } /// <summary> /// 将Guid转换为对应的饮品名称 /// </summary> public static string ToDrinkName(this Guid drinkGuid) { return _drinkMapping.TryGetValue(drinkGuid, out var name) ? name : "未知饮品"; } /// <summary> /// 兼容字符串格式Guid的重载 /// </summary> public static string ToDrinkName(this string drinkGuidStr) { return Guid.TryParse(drinkGuidStr, out var guid) ? guid.ToDrinkName() : "未知饮品"; } }
4. 替换原有拼接逻辑
原来的Guid拼接代码:
string.Join(", ", model.DrinkList.Select(x => x.Id))
直接调用扩展方法即可得到饮品名拼接结果:
// 如果x.Id是Guid类型 string.Join(", ", model.DrinkList.Select(x => x.Id.ToDrinkName())) // 如果x.Id是字符串类型的Guid string.Join(", ", model.DrinkList.Select(x => x.Id.ToDrinkName()))
内容的提问来源于stack exchange,提问作者Jesus
相关产品推荐
相关产品推荐

