/// <summary> /// 尝试根据组标识和值获取值描述(获取成功返回true;失败返回false) /// </summary> /// <param name="groupId">组标识</param> /// <param name="value">值</param> /// <param name="des">值描述</param> /// <returns>获取成功返回true;失败返回false</returns> public static bool TryGetDescriptionByValue(object groupId, object value, out string des) { des = null; ValueDescriptionGroup group = GetValueDescriptionGroupById(groupId); if (group == null) { return(false); } DisplayNameExAttribute desAtt; if (group.TryGetValue(value, out desAtt)) { des = desAtt.Description; return(true); } var groupDescriptionAtt = group.GroupDescriptionAttribute; if (groupDescriptionAtt != null && groupDescriptionAtt.Extend != null) { des = groupDescriptionAtt.Extend.GetDescription(value, group); return(true); } return(false); }
/// <summary> /// 根据组标识和值获取值描述(获取成功返回值描述;失败抛出ArgumentException异常) /// </summary> /// <param name="groupId">组标识</param> /// <param name="value">值</param> /// <returns>值描述</returns> public static string GetDescriptionByValue(object groupId, object value) { ValueDescriptionGroup group = GetValueDescriptionGroupById(groupId); if (group == null) { throw new ArgumentException($"组标识\"{groupId}\"未注册"); } DisplayNameExAttribute desAtt; if (group.TryGetValue(value, out desAtt)) { return(desAtt.Description); } var groupDescriptionAtt = group.GroupDescriptionAttribute; if (groupDescriptionAtt != null && groupDescriptionAtt.Extend != null) { return(groupDescriptionAtt.Extend.GetDescription(value, group)); } else { throw new ArgumentException($"组标识\"{groupId}\"值\"{value}\"对应的描述不存在"); } }
/// <summary> /// 清空指定组标识值描述组 /// </summary> /// <param name="groupId">组标识</param> public static void Clear(object groupId) { ValueDescriptionGroup group = GetValueDescriptionGroupById(groupId); if (group != null) { group.Clear(); } }
/// <summary> /// 获取指定类型名称数组 /// </summary> /// <param name="groupId">组标识</param> /// <returns>类型所有定义常量值数组</returns> public static string[] GetNames(object groupId) { ValueDescriptionGroup group = GetValueDescriptionGroupById(groupId); if (group != null) { return(group.Values.ToArray().Select(t => { return t.DisplayName; }).ToArray()); } else { throw new ArgumentException($"组标识\"{groupId}\"未注册"); } }
/// <summary> /// 获取指定类型值数组 /// </summary> /// <param name="groupId">组标识</param> /// <returns>类型所有定义常量值数组</returns> public static object[] GetValues(object groupId) { ValueDescriptionGroup group = GetValueDescriptionGroupById(groupId); if (group != null) { return(group.Keys.ToArray()); } else { throw new ArgumentException($"组标识\"{groupId}\"未注册"); } }
/// <summary> /// 注册描述组 /// </summary> /// <param name="groupId">组标识</param> /// <param name="group">值描述组</param> public static void Registe(object groupId, ValueDescriptionGroup group) { if (groupId == null) { throw new ArgumentNullException(nameof(groupId)); } if (group == null) { throw new ArgumentNullException(nameof(group)); } _typeValueDescriptionGroupDic.AddOrUpdate(groupId, group, (oldKey, oldValue) => { return(group); }); }
/// <summary> /// 注册常量或枚举值描述 /// </summary> /// <typeparam name="T">目标类型</typeparam> public static void Registe <T>() { Type type = typeof(T); ValueDescriptionGroupAttribute valueDescriptionGroupAtt; Type valueDescriptionGroupAttributeType = typeof(ValueDescriptionGroupAttribute); object[] attrObjArr = type.GetCustomAttributes(valueDescriptionGroupAttributeType, false); if (attrObjArr == null || attrObjArr.Length == 0) { valueDescriptionGroupAtt = null; } else { valueDescriptionGroupAtt = (ValueDescriptionGroupAttribute)attrObjArr[0]; } var group = new ValueDescriptionGroup(valueDescriptionGroupAtt); FieldInfo[] fieldInfoArr = type.GetFields(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public); Type displayNameExAttributeType = typeof(DisplayNameExAttribute); object key; DisplayNameExAttribute value; foreach (var fieldInfo in fieldInfoArr) { attrObjArr = fieldInfo.GetCustomAttributes(displayNameExAttributeType, true); if (attrObjArr == null || attrObjArr.Length == 0) { //字段无特性,忽略该字段 continue; } key = fieldInfo.GetValue(null); value = (DisplayNameExAttribute)attrObjArr[0]; if (group.ContainsKey(key)) { throw new ApplicationException($"类型[{type.FullName}]字段值[{key}]重复"); } group.Add(key, value); } Registe(type, group); }
/// <summary> /// 根据名称获取值(获取成功返回true;失败返回false) /// </summary> /// <param name="groupId">组标识</param> /// <param name="name">名称</param> /// <param name="value">值</param> /// <returns>获取成功返回true;失败返回false</returns> public static bool TryGerValueByName(object groupId, string name, out object value) { ValueDescriptionGroup group = GetValueDescriptionGroupById(groupId); if (group == null) { throw new ArgumentException($"组标识\"{groupId}\"未注册"); } var kvArr = group.ToArray().Where(t => { return(string.Equals(t.Value, name)); }).ToArray(); if (kvArr.Length > 0) { value = kvArr[0].Key; return(true); } throw new ArgumentException($"组标识\"{groupId}\"名称\"{name}\"对应的值不存在"); }
/// <summary> /// 获取扩展值对应的描述 /// </summary> /// <param name="value">值</param> /// <param name="group">描述组</param> /// <returns>值对应的描述</returns> protected override string PrimitiveGetDescription(object value, ValueDescriptionGroup group) { string des; if (this._getDescriptionFunc == null) { if (group.GroupDescriptionAttribute != null) { des = $"未知的{group.GroupDescriptionAttribute.DisplayName}\"{value}\""; } else { des = $"未知的\"{value}\""; } } else { des = this._getDescriptionFunc(value, group); } return(des); }
/// <summary> /// 获取扩展值对应的名称 /// </summary> /// <param name="value">值</param> /// <param name="group">描述组</param> /// <returns>值对应的名称</returns> protected override string PrimitiveGetName(object value, ValueDescriptionGroup group) { string name; if (this._getNameFunc == null) { if (group.GroupDescriptionAttribute != null) { name = $"未知的{group.GroupDescriptionAttribute.DisplayName}\"{value}\""; } else { name = $"未知的\"{value}\""; } } else { name = this._getNameFunc(value, group); } return(name); }
/// <summary> /// 获取扩展值对应的描述 /// </summary> /// <param name="value">值</param> /// <param name="group">描述组</param> /// <returns>值对应的描述</returns> protected abstract string PrimitiveGetDescription(object value, ValueDescriptionGroup group);
/// <summary> /// 获取扩展值对应的描述 /// </summary> /// <param name="value">值</param> /// <param name="group">描述组</param> /// <returns>值对应的描述</returns> public string GetDescription(object value, ValueDescriptionGroup group) { return(this.PrimitiveGetDescription(value, group)); }