【分享贴】将string转换成枚举的通用方法

crackpot2007 2012-07-02 08:56:53
加精
小弟愚钝,不怎么会写代码,以前遇到要将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,就这样,没别的意思,分享、献丑一下而已,顺便散点小分。
...全文
11662 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
大聪 2014-02-24
  • 打赏
  • 举报
回复
(Color)Enum.Parse(typeof(Color), "Read");
冬你个冬 2013-08-27
  • 打赏
  • 举报
回复
....看了下 感觉比较麻烦就自己谢了一个看起来简单的 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string strValue = EnumsCovert<MyEnum>(0); Response.Write(strValue); } } public enum MyEnum { 白色 = 1, 红色 = 2, 蓝色 = 3 } public string EnumsCovert<T>(int EnumsValue) { object obj = (object)EnumsValue; //Enum.Parse(GetType(typeof(T)),Value); T t = (T)obj; return t.ToString(); } public T EnumsCovert<T>(string EnumsName) { object obj = Enum.Parse(typeof(T), EnumsName); T value = (T)obj; return value; }
zrc428025 2013-04-30
  • 打赏
  • 举报
回复
支持一下支持一下
xiangaylian 2012-07-23
  • 打赏
  • 举报
回复
学习了!
QQ823952439 2012-07-22
  • 打赏
  • 举报
回复

Color color = Enum.IsDefined(typeof(Color), str) ? (Color)Enum.Parse(typeof(Color), str) : Color.red;
chengwangtianxia 2012-07-12
  • 打赏
  • 举报
回复
嘿嘿,又学到一点了。
若-相惜 2012-07-12
  • 打赏
  • 举报
回复
lz好人
LAONINGA098 2012-07-12
  • 打赏
  • 举报
回复
感谢分享
Jarno_zhang 2012-07-10
  • 打赏
  • 举报
回复
事實的真相不只有一個!(開闊思路)
skyworth98 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]
引用 19 楼 的回复:

首先感谢分享.虽然想法有大问题.

先看看这里:
http://msdn.microsoft.com/zh-cn/library/essfb559#Y833

看看其中一段: 异常

然后,楼主再想想: 弄那么多行代码,最后 return defaultValue;

是否合理?

嗯,想好了再回哦.


确实,折腾半天 还是自带的 Tr……
[/Quote]

sp......

感觉是没事找事
mingxingboke 2012-07-09
  • 打赏
  • 举报
回复
学些了谢谢啊
wilsonwangzengxin 2012-07-08
  • 打赏
  • 举报
回复
楼主可以研究一下动态枚举,EnumFactory,可以根据一个字符串来在运行时创建枚举的方法,方便扩展,需要可以找我要代码
平凡君 2012-07-08
  • 打赏
  • 举报
回复
枚举类不是很懂,学习了
xingdongfang 2012-07-07
  • 打赏
  • 举报
回复
>>此方法也无法解决web中通过url传递枚举可篡改的问题。

如果用户篡改了这个参数的值,你的程序应该停止工作,而不是自作聪明的进行“智能”转换。

tik_2012 2012-07-06
  • 打赏
  • 举报
回复
屌丝的逆袭
xmeimei123 2012-07-06
  • 打赏
  • 举报
回复
public static T StringToEnum<T>(string str)
{
return (T)Enum.Parse(typeof(T), str, false);
}
__天涯寻梦 2012-07-05
  • 打赏
  • 举报
回复
如果很多地方要 string 转枚举,说明这枚举就不该用,直接用 string 好了
Trent1985 2012-07-05
  • 打赏
  • 举报
回复
Color color = (Color)EnumParse(typeof(Color),Request.QueryString["type"],Color.red);
这个方法是书本上有的!
heromaxc 2012-07-05
  • 打赏
  • 举报
回复

public static T StringToEnum<T>(string str)
{
return (T)Enum.Parse(typeof(T), str, false);
}
sqlnnaliaoalaj 2012-07-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
Color obj = "blue".GetEnumByValue<Color>();
[/Quote]

我很好奇,这句你是怎么做到的?

public static class aaa<T>
{
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 Colors
{
black,
red,
blue
}

Colors obj = "blue".GetEnumByValue<Colors>();
------------------------
}

我点的时候string 不包含 GetEnumByValue 定义,你是怎么点出来的?????
加载更多回复(31)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧