Я написал некоторую версию следующего метода в дюжине различных решений:
//Get the string specified in the "Description" attribute of an enum value
public static string GetDescription<T>(this T enumVal) where T : Enum
{
var type = enumVal.GetType();
var member = type.GetMember(enumVal.ToString()).First();
var attrib = member.GetCustomAttribute<DescriptionAttribute>();
return attrib?.Description ?? null;
}
С учетом этого перечисления:
public enum MyEnum
{
[Description("The First")] TheFirst,
[Description("The Second")] TheSecond
}
Затем я могу написать следующий код:
MyEnum.TheFirst.GetDescription()
>> "The First"
Этот метод работает, и только так я видел, как люди это делают.Вот мой вопрос:
Как я могу получить MemberInfo
без использования Type.GetMember()
для итерации членов типа, чтобы соответствовать строке?Если вход (MyEnum.TheFirst
) уже является строго квалифицированным членом, почему рефлексия требует от меня отказаться от него и, по сути, искать элемент в виде строки?
Код I , который требуется длянапишите:
public static string GetDescription<T>(this T enumVal) where T : Enum
{
var member = enumVal.GetMember(); //gets the fully qualified MemberInfo object
var attrib = member.GetCustomAttribute<DescriptionAttribute>();
return attrib?.Description ?? null;
}
Я знаю, что мог бы написать метод расширения, чтобы сделать это, но это не решило бы фундаментальную проблему: что я должен использовать поиск string
(снова,с помощью метода System.Reflection.GetMember(string name)
), чтобы получить информацию, которая уже должна быть легко доступна.
Пожалуйста, дайте мне знать, если я думаю об этом неправильно или есть другой, более простой подход к этому.