在日常做項(xiàng)目過程中,一直很煩惱枚舉值顯示問題。當(dāng)添加,修改,刪除枚舉值時(shí),都要去修改界面原先的中文表述,很是麻煩。今天針對(duì)Enum做相應(yīng)的擴(kuò)展,并實(shí)現(xiàn)Newtonsoft.Json(JSON.NET)JsonConverter個(gè)性化定制,使數(shù)據(jù)與界面分離,此方法適用于依賴Json數(shù)據(jù)結(jié)構(gòu)傳輸數(shù)據(jù)的應(yīng)用開發(fā),例如:web 開發(fā)。
1、首先,實(shí)現(xiàn)Localization屬性標(biāo)簽
[AttributeUsage(AttributeTargets.Field)] public class LocalizationAttribute : Attribute { public LocalizationAttribute(string showValue) { ShowValue = showValue; } public string ShowValue { get; set; } }2、實(shí)現(xiàn)JsonConverter,將原先enum轉(zhuǎn)換結(jié)果改成{Value:[int],ShowValue:[string]}
public class EnumLocalizationConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType.IsEnum; } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { try { var value = serializer.Deserialize<EnumLocalization>(reader); return Enum.Parse(objectType, value.Value.ToString()); } catch { } return Enum.Parse(objectType, serializer.Deserialize(reader).ToString()); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var type = value.GetType(); var fieldName = type.GetEnumName(value); if (fieldName != null) { var localozation = type.GetField(fieldName).GetCustomAttribute<LocalizationAttribute>(); serializer.Serialize(writer, new { Value = value, ShowValue = localozation.ShowValue }); } else { serializer.Serialize(writer, new EnumLocalization() { Value = value, ShowValue = string.Empty }); } } } public class EnumLocalization { public object Value { get; set; } public string ShowValue { get; set; } }3、實(shí)現(xiàn)Enum靜態(tài)擴(kuò)展功能(獲取標(biāo)記上的文本)
public static class EnumLocalizationExtensions { public static string ToLocalizationString(this Enum _this) { var type = _this.GetType(); return type.GetField(_this.ToString()).GetCustomAttribute<LocalizationAttribute>().ShowValue; } public static IDictionary<int, string> GetLocalizations(this Enum _this) { var type = _this.GetType(); var arr = type.GetEnumValues(); Dictionary<int, string> dict = new Dictionary<int, string>(); foreach (int i in arr) { var enumValue = Enum.Parse(type, i.ToString()) as Enum; dict.Add(i, enumValue.ToLocalizationString()); } return dict; } }4、使用
public enum LogType { [Localization("登錄")] Login = 1, [Localization("退出")] Exit = 2, [Localization("添加")] Add = 3, [Localization("刪除")] Delete = 4, [Localization("修改")] Edit = 5, [Localization("測(cè)試")] Test = 6, [Localization("異常")] Exception = 7 } public class Log { public int Id { get; set; } public UserModel User { get; set; } [JsonConverter(typeof(EnumLocalizationConverter))] public LogType Type { get; set; } public Guid UId { get; set; } public string Summary { get; set; } public string Clientip { get; set; } public string ServerName { get; set; } public DateTime CreateDT { get; set; } }新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注