0

所以我正在尝试使用 System.Linq.Dynamic 解析一个简单的算术动态表达式。当在 CurrentCulture 为 English-US 的英语环境中执行时,这运行良好(并且小数点分隔符是一个普通的“.”点)。尝试在非英语环境中运行代码(例如,保加利亚语中的 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);
        }
    }
}

谢谢!

4

1 回答 1

2

您可以在运行该代码之前设置当前文化。例如,在您的代码之前添加这一行,该代码仅适用于英文风格的小数分隔符:

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
于 2012-12-06T16:07:23.457 回答