所以我试图使用System.Linq.Dynamic解析一个简单的算术动态表达式。 这在CurrentCulture为英语 - 美国的英语环境中执行时运行正常(小数点分隔符是普通的“。”点)。 尝试在非英语环境中运行代码(例如,保加利亚语中的Windows7x64,小数点分隔符为“,”逗号),ParseLambda失败。
如果我在表达式中加上“1.0”,ParseLambda在保加利亚环境中使用PraseExpression失败,说“无效的真实文字'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);
}
}
}
谢谢!
答案 0 :(得分:1)
您可以在运行该代码之前设置当前文化。例如。在您的代码之前添加此行,该代码仅适用于英式小数分隔符:
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");