Как получить атрибут отображаемого имени Enum по FieldInfo - PullRequest
0 голосов
/ 09 января 2019

В настоящее время я работаю над интересной структурой жестко закодированных данных. Пожалуйста, не отвечайте, как создать таблицу для этого. Конечно, тогда я бы отдал это себе, но мое любопытство слишком велико:).

Это основное перечисление , с которым я создаю выпадающий список

public enum ImportParamTypeEnum
{
    [Display(Name = "none")]
    None = 0,
    [Display(Name = "Produkty")]
    Product = 1,
    [Display(Name = "Test")]
    Test = 2,
}

Перечисленные ниже системные параметры для вышеуказанного выбора. Например, если я выбрал ImportParamTypeEnum.Product в dropdown, то на экране отображается I MappingColums.Product системные параметры

public class MappingColums
{
    public enum Product
    {
        [Display(Name = "pc")]
        Token = 0,
        [Display(Name = "Nazwa")]
        Name = 1,
        [Display(Name = "Cena")]
        Price = 3,
        [Display(Name = "Ilość")]
        Quantity = 4,
        [Display(Name = "Opis")]
        Description = 5,
    }

    public enum Test
    {
        [Display(Name = "tc")]
        TokenTest = 0,
        [Display(Name = "NazwaTest")]
        NameTest = 1,
        [Display(Name = "CenaTest")]
        PriceTest = 3,
        [Display(Name = "IlośćTest")]
        QuantityTest = 4,
        [Display(Name = "OpisTest")]
        DescriptionTest = 5,
    }
}

Приведенный ниже код представляет собой фрагмент кода, который создает ViewModel (я упростил некоторые вещи для простоты):

foreach (var e in Enum.GetValues(typeof(ImportParamTypeEnum)))
{
    Type[] mappingColumnsTypes = typeof(MappingColums).GetNestedTypes();
    Type type = mappingColumnsTypes.AsEnumerable().Where(x => x.Name == e.ToString()).FirstOrDefault();
    FieldInfo[] fields = AssemblyHelper.GetFields(type);

    foreach (var f in fields)
    {
        string i = f.GetValue(null).ToString();  
    }
}

AssemblyHelper

public static FieldInfo[] GetFields(Type obj)
{
    return obj.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly);
}

Этот код отлично работает, но я не хочу работать с Values из Enum, но с Display атрибутом имени.

Вопрос

Как мне получить Display атрибут имени по FieldInfo внутри foreach (var f in fields)

Рабочий раствор Я случайно написал что-то вроде этого:

foreach (var f in fields)
{
    //insted of:
    //string i = f.GetValue(null).ToString();  
    string i = f.GetCustomAttributes(typeof(DisplayAttribute), true).Cast<DisplayAttribute>().Single().Name;
}

Как предлагается в комментариях, я постараюсь сделать это лучше с циклическим прохождением атрибутов вместо полей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...