在局部环境中进行动态表达式解析

时间:2012-12-06 12:46:39

标签: localization lambda dynamic-linq linq-expressions

所以我试图使用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);
        }
    }
}

谢谢!

1 个答案:

答案 0 :(得分:1)

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

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");