所以我尝试使用System.Linq.Dynamic解析一个简单的算术动态表达式。这在英语环境中运行良好,其中CurrentCulture是English-US (小数点分隔符是纯英文)。点)。尝试在非英语环境中运行代码(例如,保加利亚语中的Windows7x64,其中小数点分隔符是",“逗号),ParseLambda失败。
如果我在表达式中放入"1.0“,ParseLambda在带有PraseExpression的保加利亚环境中会失败,并显示"Invalid real literal '1.0'”(但在英语环境中不会失败)。如果我尝试将"1,0“放入我的表达式中,ParseLambda将失败,并显示ParseExpression提示”语法错误“(这个错误在两种环境中都失败)。
有人知道解决这个问题的方法吗?
还是我错过了什么?
或者,我能以某种方式设置解析表达式的区域性吗?
我需要我的应用程序在两个环境下都能很好地运行。
我的代码运行在.NET v4.0上,并且我添加了System.Linq.Dynamic.dll (1.0.0.0)作为对项目的引用。
代码如下:
using System;
using System.Linq;
using System.Linq.Dynamic;
namespace DynamicExpressionTest
{
class Program
{
static void Main(string[] args)
{
//FAIL: ParseException: Invalid real literal '1.0' (fails only in non-English environment)
var expression1 = DynamicExpression.ParseLambda(
new System.Linq.Expressions.ParameterExpression[] { },
typeof(double),
"1.0 + 1.0");
var result1 = expression1.Compile().DynamicInvoke();
double resultD1 = System.Convert.ToDouble(result1);
Console.WriteLine(resultD1);
//FAIL: ParseException: Syntax error (fails both in English and non-English environments)
var expression2 = DynamicExpression.ParseLambda(
new System.Linq.Expressions.ParameterExpression[] { },
typeof(double),
"1,0 + 1,0");
var result2 = expression2.Compile().DynamicInvoke();
double resultD2 = System.Convert.ToDouble(result2);
Console.WriteLine(resultD2);
}
}
}谢谢!
发布于 2012-12-07 00:07:23
您可以在运行该代码之前设置当前区域性。例如,在你的代码前添加下面这一行,它只适用于英文风格的小数点分隔符:
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");https://stackoverflow.com/questions/13743954
复制相似问题