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 に答える