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