C# 从枚举类型及其名称中获取成员值、名称和自定义名称

C# 从枚举类型及其名称中获取成员值、名称和自定义名称,c#,model-view-controller,reflection,enums,C#,Model View Controller,Reflection,Enums,我想从用户那里得到一个字符串,并向他显示枚举成员及其值的列表。 例如,我有这个枚举 public enum exampleEnum { [MyCustomProperty(customName = "نام1")] member1 = 1, [MyCustomProperty(customName = "نام2")] member2 = 2, } 请帮助我创建此函数 public List<enumRe

我想从用户那里得到一个字符串,并向他显示枚举成员及其值的列表。 例如,我有这个枚举

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'}
} 
公共列表GetEnumDetailWithName(字符串enumName)
{
???
返回结果;//{name:'member1',value:1,customName='ن1575;م1'},{name:'member2',value:2,customName='ن1575;م2'}
} 
我已经写了这段代码,但还不完整 在这几行中,从所有程序集中获取枚举并完成它 然后当前获取枚举的所有成员 然后,对于枚举的任何成员,将成员添加到结果列表中,填充名称为true,但我无法填充值和自定义名称字段

     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;
    }
公共列表GetEnumDetailWithName(字符串enumName)
{
变量enumFullName=$“Bamdad.PublicEnum.Enums+{enumName}”;
var assemblyList=AppDomain.CurrentDomain.getAssemblys();
Type=null;
foreach(assemblyList中的var程序集)
{
type=assembly.GetType(enumFullName);
if(type==null)
继续;
if(type.IsEnum)
打破
}
if(type==null)
返回null;
//直到此行当前获取枚举
var members=type.GetMembers(BindingFlags.Public | BindingFlags.Static).Where(q=>q?.DeclaringType?.Name==enumName.ToList();
var properties=type.GetProperties();
如果(!members.Any())返回null;
var result=新列表();
//当前获取成员
foreach(成员中的var mem)
{
var resultItem=new enumDetail()
{
Name=mem.Name,//true
Value=0,//我无法获取
CustomName=“???”//我无法获取
};
结果。添加(resultItem);
}
返回结果;
}

请帮助我

对于这个问题,我应该使用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;
    }
公共列表GetEnumMemberFromString(字符串enumName)
{
变量enumFullName=$“Bamdad.PublicEnum.Enums+{enumName}”;
var assemblyList=AppDomain.CurrentDomain.getAssemblys();
Type=null;
foreach(assemblyList中的var程序集)
{
type=assembly.GetType(enumFullName);
if(type==null)
继续;
if(type.IsEnum)
打破
}
if(type==null)返回null;
var valuesToNames=Enum.GetValues(类型)
.Cast()
.ToDictionary(q=>Enum.GetName(type,q),q=>(int)q);
var result=valuesToNames.Select(q=>newenumDetail()
{
Name=q.Key,
值=q.值,
CustomName=type.GetMyCustomProperty(q.Key)?.ToString()?q.Key
}).ToList();
返回结果;
}
此函数用于获取自定义属性

 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;

 }
公共静态对象GetMyCustomProperty(此类型,字符串成员=”)
{
if(type==null)
返回“”;
MemberInfo[]memInfo=type.GetMember(成员);
如果(memInfo.Length