Je veux obtenir une chaîne de l'utilisateur et lui montrer une liste de membres enums et sa valeur. par exemple j'ai cette énumération

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

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

    }

Aidez moi à créer cette fonction

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

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

J'ai écrit ce code mais pas complet dans ces lignes obtenir enum de tous les assemblys et c'est fait puis obtenir tous les membres de enum currectly puis pour tout membre de enum ajouter un membre à la liste des résultats, le nom de remplissage est vrai mais je ne peux pas remplir Value et CustomName Champ ...

     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;
    }

Aidez-moi, s'il vous plaît

-1
Alireza Hejazi 24 févr. 2020 à 12:27

1 réponse

Meilleure réponse

Pour cette question, je devrais utiliser Enum.GetValues ​​et Enum.GetName , pour obtenir un attribut personnalisé, écrivez une fonction et utilisez-la

    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;
    }

Cette fonction sert à obtenir un attribut personnalisé

 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;

 }
0
Alireza Hejazi 25 févr. 2020 à 07:11