我试图从类型中获得枚举,我会解释,我有这个枚举(我使用了字符串枚举),在这里解释。
public enum ENUM1
{
[StringValue("CodeIP597")] Code = 1,
[StringValue("InfoYes")] Info = 3
}
public enum ENUM2
{
[StringValue("CodeNoIP")] Code = 1,
[StringValue("Info95p")] Info = 3
}
方法"General"是这样的:
private static void General(Type enumType)
{
var Enu = enumType.toEnum(); //i want something like this
Console.WriteLine(StringEnum.GetStringValue(Enu.Code));
}
我有很多相等的枚举这些总是包含属性"代码"one_answers"信息",所以我想为每一个枚举类型,我把它作为一个参数,在变量控制台返回我字符串值。
例如:如果我调用这个方法
General(typeof(ENUM1));
控制台将是:CodeIP597
如果我调用这个方法General(typeof(ENUM2));
控制台将是:CodeNoIP
我该怎么办?感谢all in advance
假设您的属性看起来像这样:
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);
}
在输出方面与您拥有的不完全相同,但演示了如何获取字符串值。您可能还需要添加额外的检查,以确保它们是您期望的类型或具有您期望的属性。
您最好使用名为enumt . getvalues()的方法;
如果您查看您共享的代码项目链接中的GetStringValue()
, Enum值在处理之前被转换为字符串。您可以重写GetStringValue()
以接受Type
和string
而不是类型化enum值:
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;
}
我删除了缓存,因为它不包含在函数中,但这应该是一个容易的任务来重新引入。