是否有更好的方法来创建通用转换字符串到枚举方法或枚举扩展?

问题描述 投票:0回答:2

我在枚举帮助器类中有以下方法(出于问题的目的,我对其进行了简化):

static class EnumHelper
{
    public enum EnumType1 : int
    {
        Unknown = 0,
        Yes = 1,
        No = 2
    }

    public enum EnumType2 : int
    {
        Unknown = 0,
        Dog = 1,
        Cat = 2,
        Bird = 3
    }

    public enum EnumType3
    {
        Unknown,
        iPhone,
        Andriod,
        WindowsPhone7,
        Palm
    }

    public static EnumType1 ConvertToEnumType1(string value)
    {
        return (string.IsNullOrEmpty(value)) ?
            EnumType1.Unknown :
            (EnumType1)(Enum.Parse(typeof(EnumType1), value, true));
    }

    public static EnumType2 ConvertToEnumType2(string value)
    {
        return (string.IsNullOrEmpty(value)) ?
            EnumType2.Unknown :
            (EnumType2)(Enum.Parse(typeof(EnumType2), value, true));
    }

    public static EnumType3 ConvertToEnumType3(string value)
    {
        return (string.IsNullOrEmpty(value)) ?
            EnumType3.Unknown :
            (EnumType3)(Enum.Parse(typeof(EnumType3), value, true));
    }
}

所以这里的问题是,我可以将其精简为枚举扩展方法,或者可能是某种可以处理任何类型的单一方法。我找到了一些使用基本枚举来执行此操作的示例,但我的示例的不同之处在于,如果字符串为 null 或空,所有枚举都具有

Unknown
项目,我需要返回该项目(如果未找到匹配项,我希望它失败) .

寻找类似以下的东西:

EnumType1 value = EnumType1.Convert("Yes");
// or
EnumType1 value = EnumHelper.Convert(EnumType1, "Yes");

一个函数可以完成这一切...如何处理

Unknown
元素是我所关心的部分。

编辑: 调整了其中一个枚举,使其不使用整数定义。所以我可以保证 0 永远是这种情况,但

Unknown
永远是正确的文本...我想我可以使用与 T(0) 相同的示例,但对文本“Unknown”进行另一个解析。

c# enums extension-methods
2个回答
8
投票

使用此选项,假设 Unknown 始终为 0 值。

public static T ConvertToEnum<T>(this string value) where T : new()
{
    if( !typeof(T).IsEnum )
        throw new NotSupportedException( "T must be an Enum" );

    try
    {
        return (T)Enum.Parse(typeof(T), value);
    }
    catch
    {
        return default(T); // equivalent to (T)0
        //return (T)Enum.Parse(typeof(T), "Unknown"));
    }
}

用途:

EnumType2 a = "Cat".ConvertToEnum<EnumType2>(); 
EnumType2 b = "Person".ConvertToEnum<EnumType2>(); // Unknown

OP(凯尔西)编辑:你的答案引导我找到正确的答案,所以我想我将其包含在这里:

public static T ConvertTo<T>(this string value)
{
    T returnValue = (T)(Enum.Parse(typeof(T), "Unknown", true));
    if ((string.IsNullOrEmpty(value) == false) && 
        (typeof(T).IsEnum))
    {
        try { returnValue = (T)(Enum.Parse(typeof(T), value, true)); }
        catch { }
    }
    return returnValue;
}

2
投票

使用泛型...类似这样....

public static TResult ConvertTo<TResult>( this string source )
{
     if( !typeof(TResult).IsEnum )
     {
         throw new NotSupportedException( "TResult must be an Enum" );
     }

    if (!Enum.GetNames(typeof(TResult)).Contains(source))
        return default(TResult);


     return (TResult)Enum.Parse( typeof(TResult), source );
}

代码来自这里

© www.soinside.com 2019 - 2024. All rights reserved.