У меня есть перечисление элементов перечисления и атрибутов описания
public enum CourseGrades
{
[Description("A")]
A = 11,
[Description("A-")]
AMinus = 10,
[Description("B+")]
BPlus = 9,
[Description("B")]
B = 8,
[Description("B-")]
BMinus = 7,
[Description("C+")]
CPlus = 6,
[Description("C")]
C = 5,
[Description("C-")]
CMinus = 4,
[Description("D+")]
DPlus = 3,
[Description("D")]
D = 2,
[Description("D-")]
DMinus = 1,
[Description("E")]
E = 0,
[Description("Audit")]
AU = -1,
[Description("Incomplete")]
IC = -2,
[Description("Withdrawl")]
WD = -3,
[Description("Not Applicable")]
NA = -4
}
Моя проблема в том, что я пытаюсь составить список описаний и не могу понять, как это сделать. Все ответы, которые я видел, говорят об использовании Enum.GetNames()
или Enum.GetValues()
, которые я знаю, как это сделать.
Проблема с обоими из них заключается в том, что они возвращают массив строк, который потерял весь контекст того, откуда он взялся, поэтому я не могу следовать ему, чтобы получить описание для конкретного значения перечисления, которое я хочу.
Прямо сейчас я получаю описание, вызывая CourseGrades.A.GetDescription()
, потому что у меня есть метод расширения, который обрабатывает получение атрибута описания код просмотра а>.
Я надеялся сделать что-то вроде
var elements = System.Enum.GetElements(CourseGrades);
var dict = new Dictionary<CourseGrades, string>();
foreach (var element in elements) {
dict.Add(element, element.GetDescription());
}
но я начинаю думать, что что-то подобное невозможно сделать.
Я изо всех сил старался избежать грубого форсирования, делая
private Dictionary<CourseGrades, string> _courseGradesWithCaption = null;
public Dictionary < CourseGrades, string > CourseGradesWithCaptions
{
get
{
if ( _courseGradesWithCaption == null )
_courseGradesWithCaption = new Dictionary < CourseGrades, string > ()
{
{ CourseGrades.A, CourseGrades.A.GetDescription () }
, { CourseGrades.AMinus, CourseGrades.AMinus.GetDescription () }
, { CourseGrades.BPlus, CourseGrades.BPlus.GetDescription () }
// ... snip ...
};
return _courseGradesWithCaption;
}
}
Я думал, что достиг чего-то, позаимствовав, как метод расширения, указанный выше, прошел через перечисление, выполнив
public static class EnumerationCaptionsBuilder
{
public static Dictionary < T, string > BuildCaptions<T> ( T e ) where T : IConvertible
{
if (!(e is System.Enum)) throw new ArgumentException("e is expected to be an enumeration.");
var type = e.GetType ();
var values = System.Enum.GetValues ( type );
var dict = new Dictionary<T, string> ();
foreach ( var val in values )
{
if ( (int) val != e.ToInt32 ( CultureInfo.InvariantCulture ) ) continue;
var enumElement = type.GetMember ( type.GetEnumName ( val ) ?? throw new InvalidOperationException ());
dict.Add(enumElement, enumElement.GetDescription());
}
}
}
Но именно тогда я узнал, что type.GetMember
возвращает объект MemberInfo, который мне не нужен.
Есть ли способ сделать то, что я хочу сделать, или я просто лаю невозможное дерево?