如何将类型转换为枚举

本文关键字:枚举 类型转换 | 更新日期: 2023-09-27 17:50:14

我试图从类型中获得枚举,我会解释,我有这个枚举(我使用了字符串枚举),在这里解释。

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));           
}

我有很多相等的枚举这些总是包含属性"代码"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()以接受Typestring而不是类型化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;
}

我删除了缓存,因为它不包含在函数中,但这应该是一个容易的任务来重新引入。