получить значение членов, имя и пользовательское имя из типа enum с его именем - PullRequest
0 голосов
/ 24 февраля 2020

Я хочу получить строку от пользователя и показать ему список перечислимых членов и его значение. например, у меня есть это перечисление

public enum exampleEnum
    {
        [MyCustomProperty(customName = "نام1")]
        member1 = 1,

        [MyCustomProperty(customName = "نام2")]
        member2 = 2,

    }

, помогите мне для создания этой функции

public List<enumResult> GetEnumDetailWithName(string enumName)
{
 ???

 return result;// {name:'member1',value:1,customName='نام1'},{name:'member2',value:2,customName='نام2'}
} 

я написал этот код, но не завершенный в этих строках, получаю перечисление из всей сборки, и тогда все сделано получить всех членов enum корректно, затем для любого члена enum добавить члена в список результатов, имя заполнения верно, но я не могу заполнить поля Value и CustomName ...

     public List<enumDetail> GetEnumDetailWithName(string enumName)
    {
        var enumFullName = $"Bamdad.PublicEnum.Enums+{enumName}";
        var assemblyList = AppDomain.CurrentDomain.GetAssemblies();
        Type type = null;
        foreach (var assembly in assemblyList)
        {
            type = assembly.GetType(enumFullName);
            if (type == null)
                continue;
            if (type.IsEnum)
                break;
        }

        if (type == null)
            return null;


        //until this line get enum currectly
        var members = type.GetMembers(BindingFlags.Public | BindingFlags.Static).Where(q=> q?.DeclaringType?.Name == enumName).ToList();
        var properties = type.GetProperties();
        if (!members.Any()) return null;

        var result = new List<enumDetail>();

        //get members currectly
        foreach (var mem in members)
        {

            var resultItem =  new enumDetail()
            {
                Name = mem.Name, // true
                Value = 0,       // i cant get
                CustomName = "???" // i cant get
            };

            result.Add(resultItem);
        }
        return result;
    }

, пожалуйста, помогите мне

1 Ответ

0 голосов
/ 25 февраля 2020

для этого вопроса я должен использовать Enum.GetValues ​​и Enum.GetName, для получения настраиваемого атрибута написать функцию и использовать ее

    public List<enumDetail> GetEnumMemberFromString(string enumName)
    {
        var enumFullName = $"Bamdad.PublicEnum.Enums+{enumName}";
        var assemblyList = AppDomain.CurrentDomain.GetAssemblies();
        Type type = null;
        foreach (var assembly in assemblyList)
        {
            type = assembly.GetType(enumFullName);
            if (type == null)
                continue;
            if (type.IsEnum)
                break;
        }

        if (type == null) return null;

        var valuesToNames = Enum.GetValues(type)
                .Cast<object>()
                .ToDictionary(q => Enum.GetName(type, q),q=> (int)q);

        var result = valuesToNames.Select(q => new enumDetail()
        {
            Name = q.Key,
            Value = q.Value,
            CustomName = type.GetMyCustomProperty(q.Key)?.ToString() ?? q.Key
        }).ToList();

        return result;
    }

эта функция предназначена для получения настраиваемого атрибута

 public static object GetMyCustomProperty(this Type type,string member = "")
    {
        if (type == null)
            return "";
        MemberInfo[] memInfo = type.GetMember(member);
        if (memInfo.Length <= 0) return member;

        object[] attrs = memInfo[0].GetCustomAttributes(typeof(MyCustomPropertyAttribute), false);
        if (!attrs.Any())
            return null;

        var result = ((MyCustomPropertyAttribute)attrs[0]);

  return result.customName;

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