从枚举中获取DescriptionAttribute

时间:2013-03-05 20:46:37

标签: c# enums

我有一个用于查找协调字符串值的枚举。其中一个枚举中有一个空格,因此我尝试使用description属性来查找该值。在找到DescriptionAttribute后,我无法回到公共类。

public class Address
{
   ...blah...more class datatypes here...

    public AddressType Type { get; set; }

    ...blah....

}

public enum AddressType
{
    FRA = 0,
    JAP = 1,
    MEX = 2,
    CAN = 3,
    [Description("United States")]
    UnitedStates = 4, 

}


 if (Address.Type.ToString() == "UnitedStates")
            {
               Adddress.Type = GetDescription(Address.Type);
            }

private static AddressType GetDescription(AddressType addrType)
    {
        FieldInfo fi = addrType.GetType().GetField(addrType.ToString());
        DescriptionAttribute[] attributes =
        (DescriptionAttribute[])fi.GetCustomAttributes(
        typeof(DescriptionAttribute), false);
        return (attributes.Length > 0) ? attributes[0].Description : addrType.ToString();            
    }

在GetDescription方法中,如何将其强制转换回其公共类数据类型“AddressType”,它失败了,因为这里是一个字符串?

3 个答案:

答案 0 :(得分:2)

我担心我不能100%确定您的要求,但以下方法会返回string描述或提供的AddressType的名称。

private static string GetDescription(AddressType addrType)
{
    FieldInfo fi = addrType.GetType().GetField(addrType.ToString());
    DescriptionAttribute[] attributes = 
        (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
    return (attributes.Length > 0) ? attributes[0].Description : addrType.ToString();            
}

请注意返回类型string

答案 1 :(得分:0)

您无法直接将字符串转换为枚举。您需要编写一个转换器方法,该方法接受一个字符串并返回枚举。

简单示例,但您可以使用字典并使其成为自己的类。

//string values are case sensitive
    private AddressType StringToEnum(string enumString)
            {
                AddressType returnValue;
                switch (enumString)
                {
                    case "United States":
                        returnValue = AddressType.UnitedStates;
                        break;
                    case "France":
                        returnValue = AddressType.FRA;
                        break;
                    case "Japan":
                        returnValue = AddressType.JAP;
                        break;
                    case "Mexico":
                        returnValue = AddressType.MEX;
                        break;
                    case "Canada":
                        returnValue = AddressType.CAN;
                        break;
                    default:
                        returnValue = AddressType.UnitedStates;
                        break;

                }
                return returnValue;
            }

如果您希望将字符串转换为枚举,则需要执行此类操作。

答案 2 :(得分:0)

您可以使用辅助方法从sting中删除空格并找到正确的Enum

示例:

public T EnumFromString<T>(string value) where T : struct
{
    string noSpace = value.Replace(" ", "");
    if (Enum.GetNames(typeof(T)).Any(x => x.ToString().Equals(noSpace)))
    {
        return (T)Enum.Parse(typeof(T), noSpace);
    }
    return default(T);
}

用法:

    public enum Test
    {
        UnitedStates,
        NewZealand
    }

    Test MyEnum = EnumFromString<Test>("New Zealand"); // Returns 'NewZealand'