2012-12-06 32 views
0

所以我試圖用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); 
     } 
    } 
} 

謝謝!

回答

1

您可以在運行該代碼之前設置當前文化。例如。在您的代碼之前添加此行,該代碼只能與英文樣式的小數點分隔符一起使用:

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

是的,它似乎已經成功了。我擔心它可能會插手我的應用程序的文化,但是我將它設置在CurrentUICulture上,所以CurrentCulture看起來可以安全地更改(並且幕後數據始終在InvariantCulture中)。謝謝@Clafou! – alrotem