我试图从类型中获取枚举,我将解释,我有这个枚举(我使用字符串枚举),这些解释为here。
public enum ENUM1
{
[StringValue("CodeIP597")] Code = 1,
[StringValue("InfoYes")] Info = 3
}
public enum ENUM2
{
[StringValue("CodeNoIP")] Code = 1,
[StringValue("Info95p")] Info = 3
}
方法"一般"是这样的:
private static void General(Type enumType)
{
var Enu = enumType.toEnum(); //i want something like this
Console.WriteLine(StringEnum.GetStringValue(Enu.Code));
}
我有很多等于枚举每个都包含属性" Code"和"信息" ,所以我希望对于我作为参数放置的每个enumType,在变量控制台中返回字符串值。
例如: 如果我称这种方法
General(typeof(ENUM1));
控制台将是: CodeIP597
如果我称这种方法
General(typeof(ENUM2));
控制台将是: CodeNoIP
我该怎么办?感谢所有提前
答案 0 :(得分:3)
假设您的属性看起来像这样:
public class StringValue : Attribute
{
public string Name { get; private set; }
public StringValue(string name)
{
this.Name = name;
}
}
然后你必须使用反射来提取属性及其值,因为除了它们的值名之外,你的枚举之间没有任何关系:
private static void General(Type enumType)
{
if (!enumType.IsEnum)
throw new ArgumentException("Not an enum type");
var values = enumType.GetFields();
var code = values.First(f => f.Name == "Code");
var info = values.First(f => f.Name == "Info");
string codeString = code.GetCustomAttributes(false).OfType<StringValue>().First().Name;
string infoString = info.GetCustomAttributes(false).OfType<StringValue>().First().Name;
Console.WriteLine(codeString);
Console.WriteLine(infoString);
}
它与输出方面的内容不完全相同,但演示了如何获取字符串值。您可能还需要添加其他检查,它们是您期望的类型或具有您期望的属性。
答案 1 :(得分:0)
您最好使用名为enum.GetValues();
的方法答案 2 :(得分:0)
如果查看共享的代码项目链接中的GetStringValue()
,则在处理之前将Enum值转换为字符串。您可以重写GetStringValue()
以接受Type
和string
而不是键入的枚举值:
public static string GetStringValue(Type enumType, string valueStr)
{
//Look for our 'StringValueAttribute'
//in the field's custom attributes
FieldInfo fi = enumType.GetField(valueStr);
StringValueAttribute[] attrs =
fi.GetCustomAttributes(typeof (StringValueAttribute),
false) as StringValueAttribute[];
if (attrs.Length > 0)
{
return attrs[0].Value;
}
return null;
}
我删除了缓存,因为它没有包含在函数中,但重新引入应该是一件容易的事。