我是C#的新手,我在枚举方面遇到了一些麻烦。
我让Enum定义如下:
public enum CustomFields
{
[Display(Name = "first_name")]
FirstName = 1,
[Display(Name = "last_name")]
LastName = 2,
}
我需要的是检查显示名称是否存在的代码,如果存在,则返回枚举值。
所以,如果我有显示名称:
var name = "first_name";
我需要类似的东西:
var name = "first_name";
CustomFields.getEnumValue(name);
这应该返回:
CustomFields.FirstName;
答案 0 :(得分:18)
您可以使用泛型:
public class Program
{
private static void Main(string[] args)
{
var name = "first_name";
CustomFields customFields = EnumHelper<CustomFields>.GetValueFromName(name);
}
}
public enum CustomFields
{
[Display(Name = "first_name")]
FirstName = 1,
[Display(Name = "last_name")]
LastName = 2,
}
public static class EnumHelper<T>
{
public static T GetValueFromName(string name)
{
var type = typeof (T);
if (!type.IsEnum) throw new InvalidOperationException();
foreach (var field in type.GetFields())
{
var attribute = Attribute.GetCustomAttribute(field,
typeof (DisplayAttribute)) as DisplayAttribute;
if (attribute != null)
{
if (attribute.Name == name)
{
return (T) field.GetValue(null);
}
}
else
{
if (field.Name == name)
return (T) field.GetValue(null);
}
}
throw new ArgumentOutOfRangeException("name");
}
}
答案 1 :(得分:1)
请尝试以下操作。
void Main()
{
CustomFields value1 = GetEnumValue("first_name");
CustomFields value2 = GetEnumValue("last_name");
}
static Dictionary<string, CustomFields> displayNameMapping;
static CustomFields GetEnumValue(String displayName){
if (displayNameMapping == null){
var enumType = typeof(CustomFields);
var displayAttributeType = typeof(DisplayAttribute);
CustomFields? found = null;
displayNameMapping = new Dictionary<string, CustomFields>();
Enum.GetNames(enumType).ToList().ForEach(name=>{
var member = enumType.GetMember(name).First();
var displayAttrib = (DisplayAttribute)member.GetCustomAttributes(displayAttributeType, false).First();
displayNameMapping.Add(displayAttrib.Name, (CustomFields)Enum.Parse(enumType, name));
});
}
return displayNameMapping[displayName];
}
// Define other methods and classes here
public enum CustomFields
{
[Display(Name = "first_name")]
FirstName = 1,
[Display(Name = "last_name")]
LastName = 2,
}