使用 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 000
或1,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时的注意事项