首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

【分享贴】将string转换成枚举的通用方法,该怎么解决

2013-10-21 
【分享贴】将string转换成枚举的通用方法小弟愚钝,不怎么会写代码,以前遇到要将string转化成枚举的时候,都是

【分享贴】将string转换成枚举的通用方法
小弟愚钝,不怎么会写代码,以前遇到要将string转化成枚举的时候,都是去遍历枚举进行字符串匹配来取得枚举,用的比较多的情况如:default.aspx?type=black,要在程序里通过以下方法取得black:

enum Color
{
    red,
    white,
    black,
    yellow
}

Color GetColorType(string s)
{
    Color color = Color.red;
    foreach(Color c in Enum.GetValues(typeof(Color)))
    {
        if(s == c)
        {
            color = c;
            break;
        }
    }
}

所以,针对这种情况就必须遇到不同的枚举,就得写不同的foreach来实现此功能,甚是麻烦。

后来,动用了几十亿个细胞(小弟真是不才),才想了以下这一招通用函数来转换:



        public static object EnumParse(Type type, object value, object defaultValue)
        {
            object obj = null;
            try
            {
                obj = Enum.Parse(type, value.ToString());
            }
            catch
            {
                return defaultValue;
            }

            if (obj.ToString() == "0" || ConvertToInt(obj.ToString()) != 0)
                return defaultValue;
            else
                return obj;
        }
        public static int ConvertToInt(string s)
        {
            try


            {
                return Convert.ToInt16(s);
            }
            catch
            {
                return 0;
            }
        }




最终,最上面的foreach代码可简化为:

Color color = (Color)EnumParse(typeof(Color),Request.QueryString["type"],Color.red);


OK,就这样,没别的意思,分享、献丑一下而已,顺便散点小分。
[解决办法]
感谢分享····
[解决办法]
用扩展方法优化了一下

        /// <summary>
        /// 根据字符串返回对应枚举类型
        /// </summary>
        /// <typeparam name="T">对应枚举类型</typeparam>
        /// <param name="source">字符串</param>
        /// <returns></returns>
        public static T GetEnumByValue<T>(this string source)
        {
            if (typeof(T).BaseType == typeof(Enum))
            {
                foreach (T value in Enum.GetValues(typeof(T)))
                {
                    if (source == value.ToString())


                    {
                        return value;
                    }
                }
            }
            else
            {
                throw new ArgumentException("T必须为枚举类型");
            }

            return default(T);
        }
//调用
 public enum Color
    {
        black,
        red,
        blue
    }
    Color obj = "blue".GetEnumByValue<Color>();


[解决办法]

    public object GetValue(Type type, string value, object defaultValue)
    {
        FieldInfo f = type.GetField(value, BindingFlags.Static 
[解决办法]
 BindingFlags.Public);
        if (f == null)
            return defaultValue;
        else
        {
            Color c = 0;
            return f.GetValue(c);
        } 
    }

Color c = (Color)GetValue(typeof(Color), "black", Color.red);

[解决办法]
    protected void Page_Load(object sender, EventArgs e) 


    {
        Color c = (Color)GetValue(typeof(Color), "white", Color.red);
        Response.Write(c);
    }
    public object GetValue(Type type, string value, object defaultValue)
    {
        FieldInfo f = type.GetField(value, BindingFlags.Static 
[解决办法]
 BindingFlags.Public);
        if (f == null)
            return defaultValue;
        else
        {
            return f.GetValue(null);
        } 
    }


[解决办法]
引用:
此方法也无法解决web中通过url传递枚举可篡改的问题。

引用:

用扩展方法优化了一下
C# code

/// <summary>
/// 根据字符串返回对应枚举类型
/// </summary>
/// <typeparam name="T">对应枚举类型</typeparam>
/// <param name="source">字符串</para……


无论你把键值修篡改成什么,枚举中不存在时,都会默认返回第一个枚举值。
而且如果要避免这种非法数据,也应该是另写验证逻辑。
[解决办法]
感谢分享。  
[解决办法]
通用字符串转枚举,可指定是否区分大小写


    public static TEnum ToEnum<TEnum>(this string input, bool ingoreCase) where TEnum : struct
    {
        if (!typeof(TEnum).IsEnum)
        {
            throw new InvalidCastException("TEnum 不是枚举类型。");
        }

        return (TEnum)Enum.Parse(typeof(TEnum), input, ingoreCase);
    }

[解决办法]
感谢分享
[解决办法]
感谢分享····
------解决方案--------------------


感谢分享····
[解决办法]
感谢分享····
[解决办法]
不错不错
[解决办法]
支持!!感谢!
[解决办法]
顶起 【分享贴】将string转换成枚举的通用方法,该怎么解决
[解决办法]
路过,喜欢看高手们的评论
[解决办法]
【分享贴】将string转换成枚举的通用方法,该怎么解决顶起
[解决办法]
为什么不用Enum.TryParse,这个还是泛型方法,
如果是.net3.5或以上,可以为String类型写个扩展方法,如下


class EnumTest
    {
        public static void Test()
        {
            Console.WriteLine("black".Parse<Color>(Color.Red));
        }
    }

    public enum Color
    {
        [Description("红色")]
        Red,
        [Description("黑色")]
        Black,
        White
    }

    public static class EnumExtenstion
    {
        public static String GetDest<T>(this T value)
        {
            var field = typeof(T).GetField(value.ToString());
            var attrs = (DescriptionAttribute[])field.GetCustomAttributes(typeof(DescriptionAttribute), true);
            if (attrs.Length > 0)
            {
                return attrs[0].Description;
            }
            else
            {


                return "UNKNOWN";
            }

        }

        public static T Parse<T>(this string value, T defaultValue)
            where T : struct
        {
            T v;
            if (!Enum.TryParse<T>(value, true, out v))
            {
                v = defaultValue;
            }
            return v;
        }
    }


[解决办法]
不错不错

热点排行