2016-06-24 10 views
0

I CSharpEval's ScopeCompile Funktionalität bin mit mir zu erlauben, einen kompilierte Ausdruck auf verschiedene Daten wieder zu verwenden:ScopeCompile erwartet, dass bereits Variablen existieren, negiert das nicht den ganzen Punkt?

 var exp = new CompiledExpression<int>("a.Count"); 
     var func = exp.ScopeCompile(); 

Aber ich bekomme diese Ausnahme in dem ScopeCompile Aufruf:

Eine Ausnahme vom Typ "ExpressionEvaluator.Parser.ExpressionParseException" ist in ExpressionEvaluator.dll aufgetreten, wurde aber nicht im Benutzercode verarbeitet

Weitere Informationen: Kann nicht aufgelöst werden Symbol "a" bei Zeile 1 char 0

Ich verstehe nicht, was passiert. Das Beispiel in meinem Link erlaubt das Caching von Scope-kompilierten Ausdrücken und was nutzt es, wenn die Variablen in meinem Ausdruck bereits vorhanden sein müssen, wenn der Ausdruck kompiliert wird ?!

Die Dokumentation ist ziemlich begrenzt und dieser Bereich von C# ist nicht einer, den ich gut genug verstehe, um einfach den Quellcode einfach zu lesen.

Antwort

1

können Sie versuchen, folgende,

public class ScopeContext<TArg,TRet>{ 

    public dynamic Scope {get;set;} 

    public Func<TArg,TRet> Expression; 

    public ScopeContext(string exp){ 
     TypeRegistry tr = new TypeRegistry(); 
     tr.RegisterSymbole("scope",Scope); 

     Expression = (new CompiledExpression<TRet>(exp) 
     { 
      TypeRegistry = tr 
     }).ScopeCompile<TArg>(); 
    } 

} 

// usage 

ScopeContext<object,object> f = 
    new ScopeContext<object,object>("scope.Count"); 


// you can now change scope dynamically... 
f.Scope = new List<int>(); 

var result = f.Expression(null); 
+0

Ich bin verwirrt, wie ich diese kompilierten Ausdruck mit verschiedenen Daten wiederverwenden kann, wenn ich die Daten zur Compile-Zeit zur Verfügung stellen müssen? In dem verlinkten Beispiel 'GetCachedFunction' wie funktioniert das? Ich bin mir nicht sicher, ob die Dokumentation schlecht ist oder ob ich etwas Grundlegendes verpasse! –

+0

@ Mr.Boy Wie wollen Sie "a" weitergeben? Was er mit GetCachedFunction meint, ist, dass Sie 'ScopeCompile' nicht aufrufen müssen, da es sich um einen CPU-intensiven Betrieb handelt. Sie können 'func' in Ihrem Cache speichern, um denselben Ausdruck aufzurufen. –