public static bool TryGetEnumEntry(this Enum enumValue, bool underlyingType, out EnumEntry entry) { FieldInfo field = null; if (enumValue != null) { field = enumValue.GetType().GetField(enumValue.ToString()); } if (field == null) { entry = new EnumEntry(); return(false); } var alias = (AliasAttribute)Attribute.GetCustomAttribute(field, typeof(AliasAttribute)); var description = (DescriptionAttribute)Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)); entry = new EnumEntry(field.DeclaringType, field.Name, underlyingType ? System.Convert.ChangeType(enumValue, Enum.GetUnderlyingType(enumValue.GetType())) : enumValue, alias == null ? null : alias.Alias, description == null ? null : ResourceUtility.GetString(description.Description, field.DeclaringType.Assembly)); return(true); }
/// <summary> /// 获取指定枚举的描述对象数组。 /// </summary> /// <param name="enumType">要获取的枚举类型,可为<seealso cref="System.Nullable"/>类型。</param> /// <param name="underlyingType">是否将生成的 <seealso cref="EnumEntry"/> 元素的 <seealso cref="EnumEntry.Value"/> 属性值置为 enumType 参数对应的枚举项基类型值。</param> /// <param name="nullValue">如果参数<paramref name="enumType"/>为可空类型时,该空值对应的<seealso cref="EnumEntry.Value"/>属性的值。</param> /// <param name="nullText">如果参数<paramref name="enumType"/>为可空类型时,该空值对应的<seealso cref="EnumEntry.Description"/>属性的值。</param> /// <returns>返回的枚举描述对象数组。</returns> public static EnumEntry[] GetEnumEntries(Type enumType, bool underlyingType, object nullValue, string nullText) { if (enumType == null) { throw new ArgumentNullException(nameof(enumType)); } Type underlyingTypeOfNullable = Nullable.GetUnderlyingType(enumType); if (underlyingTypeOfNullable != null) { enumType = underlyingTypeOfNullable; } EnumEntry[] entries; int baseIndex = (underlyingTypeOfNullable == null) ? 0 : 1; var fields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static); if (underlyingTypeOfNullable == null) { entries = new EnumEntry[fields.Length]; } else { entries = new EnumEntry[fields.Length + 1]; entries[0] = new EnumEntry(enumType, string.Empty, nullValue, nullText, nullText); } for (int i = 0; i < fields.Length; i++) { var alias = fields[i].GetCustomAttributes(typeof(AliasAttribute), false).OfType <AliasAttribute>().FirstOrDefault(); var description = fields[i].GetCustomAttributes(typeof(DescriptionAttribute), false).OfType <DescriptionAttribute>().FirstOrDefault(); entries[baseIndex + i] = new EnumEntry(enumType, fields[i].Name, underlyingType ? System.Convert.ChangeType(fields[i].GetValue(null), Enum.GetUnderlyingType(enumType)) : fields[i].GetValue(null), alias == null ? string.Empty : alias.Alias, description == null ? string.Empty : ResourceUtility.GetString(description.Description, enumType.Assembly)); } return(entries); }
public static bool TryGetEnumEntry(this Enum enumValue, out EnumEntry entry) { return(TryGetEnumEntry(enumValue, false, out entry)); }