3

調整する文字列値を見つけるために使用する列挙型があります。これらの列挙型の 1 つにスペースが含まれているため、説明属性を使用してその値を見つけようとしています。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' にキャストして戻すにはどうすればよいですか? ここでは文字列であるため、失敗します。

4

3 に答える 3

3

残念ながら、あなたが何を求めているのか 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

于 2013-03-05T21:05:54.690 に答える
0

ヘルパーメソッドを使用して、スティングからスペースを削除し、正しい列挙型を見つけることができます。

例:

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'
于 2013-03-05T21:34:19.000 に答える
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;
            }

文字列を列挙型に変換する場合は、次のようにする必要があります。

于 2013-03-05T20:51:17.303 に答える