2012-10-19 154 views
1

給定一個字符串中的動態if語句是否有.net中的一個方法來評估並返回正確的結果。動態C#公式評估

I.E.

static void Main(string[] args) 
    { 
     String a = "if(\"Alex\" == \"Alex\"){return 1;}else{return 0;}"; 
     passThroughTest.Program.evalStatement(a); 
    } 
    public static void evalStatement(String statement) 
    { 

     //Evaluation of Statement 

    } 

這是不完美的,但在這種情況下,最終的結果將是1,這似乎從這個角度來看「愚蠢」,但其對於更復雜的引擎,它需要借鑑類似的語法評估。

我是否需要編寫某種解析器並評估語句...?

感謝您的幫助!

+0

您的語句是如何複雜的打算是什麼? http://stackoverflow.com/questions/826398/is-it-possible-to-dynamically-compile-and-execute-c-sharp-code-fragments是使用CodeDom的教科書示例 – dash

+0

謝謝你的鏈接。我會深入挖掘它。它不應該太複雜;儘管它可能達到嵌套if或使用switch語句的地步。 –

+0

這是最好的和真棒方法點擊[這裏](http://stackoverflow.com/questions/1437964/best-and-shortest-way-to-evaluate-mathematical-expressions/1438829#1438829) – Sarbanjeet

回答

1
  • 您可以使用javascript.net

    示例代碼從他們的網站:

    // Initialize a context 
    using (JavascriptContext context = new JavascriptContext()) { 
    
        // Setting external parameters for the context 
        context.SetParameter("console", new SystemConsole()); 
        context.SetParameter("message", "Hello World !"); 
        context.SetParameter("number", 1); 
    
        // Script 
        string script = @" 
         var i; 
         for (i = 0; i < 5; i++) 
          console.Print(message + ' (' + i + ')'); 
         number += i; 
        "; 
    
        // Running the script 
        context.Run(script); 
    
        // Getting a parameter 
        Console.WriteLine("number: " + context.GetParameter("number")); 
    } 
    
  • 或者使用C#表達式樹,見Building Expression Evaluator with Expression Trees

+0

這種方法看起來好像會在長時間內使用更少的開銷......我會嘗試一下,看看它是如何工作的。謝謝! –

0

你也可以這樣做這個:

var expression="(\"Alex\" == \"Alex\") ? 1:0"; 
var res = FlexRule.DynamicEvaluation.ExpressionEval.Default.Compute(null, expression); 

爲了表達的更多細節信息,請看看 http://wiki.flexrule.com/index.php?title=Expression