使用 Enum.Parse() 是安全的,无论传递整数时两端使用的当前文化如何

Posted

技术标签:

【中文标题】使用 Enum.Parse() 是安全的,无论传递整数时两端使用的当前文化如何【英文标题】:Is is safe to use Enum.Parse() regardless of current culture used in either end when passing integers 【发布时间】:2013-07-26 21:33:47 【问题描述】:

对于 C# 浮点类型,我知道一种“文化效应”是可以使用 ',' 而不是 '.',但对于整数类型,可能的效果是什么?

我问起

 Int32.TryParse() 

将接受 CultureInfo.InvariantCulture (IFormatProvider) 参数,但

 (T)Enum.Parse(typeof(T), enumString, true);

即使 Enum.Parse() 接受整数或枚举文字也不行。

示例:客户端将 Int32.ToString() 与一种文化一起使用,而服务器将 Enum.Parse() 与另一种文化一起使用(当前因为没有 arg)。

【问题讨论】:

整数也有分隔符。即1 000 0001,000,000。我想还有其他人。 我个人不将 Enum.Parse 用于整数值。您可以为此使用 int.Parse 和强制转换。我什至不知道它会起作用,但我认为这在文化方面是不可靠的。在法语中,我们使用单引号 ''' 作为千位分隔符,而在英语中通常使用逗号 ','。那样的事情可能会失败。 【参考方案1】:

文档并不清楚实际行为是什么,因此我查看了Enum.Parse 的源代码(在 .NET 4.5 中)。从输入字符串解析整数值时,它将始终使用不变的文化(不是当前文化)。具体解析整数的行是:

temp = Convert.ChangeType(value, underlyingType, CultureInfo.InvariantCulture);

通过检查第一个字符是否为数字(使用Char.IsDigit)、'+''-' 来识别数值。因此,如果您在客户端使用不变区域性转换为字符串并在服务器上使用Enum.Parse 并且它们都使用.NET 4.5,那么您将是安全的。但是,我不确定这是旧版本框架的行为还是未来版本的保证。

【讨论】:

以上是关于使用 Enum.Parse() 是安全的,无论传递整数时两端使用的当前文化如何的主要内容,如果未能解决你的问题,请参考以下文章

使用Enum.Prase及Enum.TryPrase时的注意事项

使用反射将string转换为enum

Android:通过静态变量传递值会导致安全问题吗?

C#如何将枚举类(enum)型转换成字符(string)类型

enum与字符串相互转换

c#中怎么将string转化为枚举