C# 从枚举获取DescriptionAttribute

C# 从枚举获取DescriptionAttribute,c#,enums,C#,Enums,我有一个枚举,用于查找协调字符串值。其中一个枚举中有一个空格,因此我尝试使用description属性来查找该值。在找到DescriptionAttribute之后,我很难回到公共类 public class Address { ...blah...more class datatypes here... public AddressType Type { get; set; } ...blah.... } 在GetDescription方法中,如何将其强制转换回其公

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

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

    public AddressType Type { get; set; }

    ...blah....
}


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

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

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

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

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

恐怕我不能100%确定您要求的是什么,但以下方法返回所提供的
地址类型的
字符串
描述或名称

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

您可以使用helper方法从sting中删除空格并找到正确的枚举

例如:

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 T EnumFromString(字符串值),其中T:struct
{
字符串noSpace=value.Replace(“,”);
if(Enum.GetNames(typeof(T)).Any(x=>x.ToString().Equals(noSpace)))
{
返回(T)Enum.Parse(typeof(T),noSpace);
}
返回默认值(T);
}
用法:

    public enum Test
    {
        UnitedStates,
        NewZealand
    }

    Test MyEnum = EnumFromString<Test>("New Zealand"); // Returns 'NewZealand'
公共枚举测试
{
美国,,
新西兰
}
Test MyEnum=EnumFromString(“新西兰”);//返回“新西兰”

枚举是
AddrType
,但您向方法传递的参数类型是
AddressType
。当方法的返回类型为
AddressType
时,您还试图返回
字符串。很抱歉,上面提到的enum是另一个公共类的一部分。由于类型名称不匹配,您仍然会遇到问题(至少给出您发布的代码)(
AddressType
vs
addrttype
)您提供的方法的返回类型不是
string
。我遇到的问题是字符串。我需要将其转换回AddressType,addrType只是我相信的本地名称。因此,您希望将
AddressType
传递到方法中,以获取
string
描述,然后将其转换回original
AddressType
?为什么?是的,我遇到的问题是,我希望将其作为AddressPye返回,因为它是我的类(枚举)的一部分
    public enum Test
    {
        UnitedStates,
        NewZealand
    }

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