所以我試圖用System.Linq.Dynamic解析一個簡單的算術動態表達式。 在CurrentCulture爲英語 - 美國英語環境(並且小數點分隔符是一個普通的「。」點)執行時,它運行正常。 嘗試在非英語環境中運行代碼(例如,保加利亞語中的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);
}
}
}
謝謝!
是的,它似乎已經成功了。我擔心它可能會插手我的應用程序的文化,但是我將它設置在CurrentUICulture上,所以CurrentCulture看起來可以安全地更改(並且幕後數據始終在InvariantCulture中)。謝謝@Clafou! – alrotem