Frage

    

Diese Frage bereits eine Antwort hier:

         

Wir brauchen einen Wert in einem Objekt in Laufzeit zu bewerten, während wir eine textliche Aussage über den genauen Mitglied Pfad zum Beispiel haben: myobject.firstMember.secondMember [3] .text
wir dachten, diese textliche Aussage mit Regex Parsen und bewerten dann den Textwert durch Reflexion verwenden, aber bevor wir, dass ich frage mich, ob C # Unterstützung eine Art eval Fähigkeit? so werden wir das Parsen ourself nicht tun müssen. Wie geht es Microsoft dies in ihrer unmittelbaren Fenster oder Uhr Fenster?

Danke Ihnen sehr,

Adi Barda

War es hilfreich?

Lösung

Wahrscheinlich ist der einfachste Weg Databinder zu verwenden, .Eval von System.Web.UI:

var foo = new Foo() { Bar = new Bar() { Value = "Value" } };
var value = DataBinder.Eval(foo, "Bar.Value");

Andere Tipps

Ich habe ein Open-Source-Projekt geschrieben, Dynamische Expresso , dass Textausdruck umwandeln kann mit einem schriftlichen C # Syntax in Teilnehmer (oder Ausdrucksbaum). Ausdrücke werden analysiert und umgewandelt in Expression Trees ohne Kompilierung oder Reflexion verwendet wird.

Sie können so etwas wie schreiben:

var interpreter = new Interpreter();
var result = interpreter.Eval("8 / 2 + 2");

oder

var interpreter = new Interpreter()
                .SetVariable("service", new ServiceExample());

string expression = "x > 4 ? service.SomeMethod() : service.AnotherMethod()";

Lambda parsedExpression = interpreter.Parse(expression, 
                        new Parameter("x", typeof(int)));

parsedExpression.Invoke(5);

Meine Arbeit basiert auf Scott Gu Artikel http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic- abfrage library.aspx .

In der Zukunft (um den 5,0 zeitlichen Rahmen), der „Compiler als Service“ kann in der Lage sein, dies zu tun. Eigentlich können Sie in der Lage sein, eine Menge von dieser nun mit „mono“ zu tun (siehe CsharpRepl und Mono.CSharp - aber ich es erwarten ‚ll brauchen viel mehr über den Kontext kennen, um lokale Variablen zu verwenden, etc in Evaluate .) - aber es gibt keine Unterstützung für diesen in dem aktuellen MS .NET-Angebote

Im Moment würde man so etwas tun, was eine Menge von der Datenbindung Code nicht ... teilen Sie es abgesehen von Token wie „“ und verwenden Reflexion. Streng genommen ist die verbindliche Code tatsächlich verwendet TypeDescriptor / PropertyDescriptor eher als direkte Reflexion, aber die Wirkung ist die gleiche.

Obwohl ein etwas schwergewichtigen Ansatz können Sie C # CodeDom verwenden, um eine neue eine neue Baugruppe zu emittieren, das eine Methode enthält nur mit dieser Zeile Code.

Das ist viel plumpe als einige der anderen Vorschläge, ich gebe zu, aber auf der anderen Seite können Sie die C # Parser schweres Heben zu tun, so sollte es in der Lage sein, alles, was Sie es so lange werfen zu handhaben als es ist gültig C #.

Wenn Sie diesen Weg gehen, müssen Sie auch sicherstellen, dass Sie die Baugruppe wieder emittiert entladen kann, so zu schaffen und AppDomains Entladen notwendig sein kann.

Ich habe erfolgreich umgesetzt und verwendet, um die oben beschriebene Technik. Auf der anderen Seite können, wenn Sie ein Dynamic wäre es viel mehr Licht Gewicht. Allerdings habe ich nie diesen Ansatz versucht, so kann ich nicht sagen, ob Sie ein Dynamic Körper C # Literale mit implementieren können.

die Ausdrucksauswertung und Regel-Engine-Funktion von Windows Workflow Foundation kann eigentlich tun, Dinge wie diese. Siehe Einführung in die Windows Workflow Foundation Rules Engine .

Eine interessante Sache über diese Komponenten ist, dass sie entworfen wurden, so dass Sie die Entwurfszeitkomponenten in eigenen Anwendungen hosten können Sätze von Regeln und / oder Ausdrücke zu entwerfen, die im Rahmen der eigenen benutzerdefinierten Klassen arbeiten. Zum Beispiel, würden Sie sagen, es einen Ausdruck gegen „myObject“ zu entwerfen, und es würde wissen, dass es ein firstMember ist, die eine secondMember hat, die einen Indexer hat einen Typ ergibt, die eine Texteigenschaft hat. Sie können die Ausdrücke und Regeln als XML bestehen bleiben, und sie zurück zur Laufzeit lesen, ohne den Designer zur Laufzeit verwenden zu müssen.

Insbesondere finden Sie unter Externe RuleSet Toolkit Beispiel .

Leider ist C # haben noch keine nativen Einrichtungen zu tun genau das, was Sie fragen.

Allerdings ist mein C # eval Programm erlaubt C # -Code zur Auswertung. Es bietet für C # -Code zur Laufzeit zu bewerten und viele C # Anweisungen unterstützt, darunter Ausdrücke wie " myobject.firstMember.secondMember [3] .text ". In der Tat ist dieser Code verwendbar innerhalb eines beliebigen .NET-Projektes, ist es jedoch zur Verwendung von C # Syntax begrenzt ist. Werfen Sie einen Blick auf meine Website, http://csharp-eval.com , für weitere Details.

Sie können immer mein leichtgewichtige C # Eval Programm versuchen. Es erstellt eine wesentliche Teilmenge der Sprache C # zu dynamischen Methoden. Vollständige Einzelheiten über die GitHub-Repository DavidWynne / CSharpEval

AFAIK gibt es keine solche Einbau-Eval-Funktion. Sie verlassen nun die Regex + Reflection Weg zu gehen. Ich denke auch, dass Visual Studio ist das gleiche zu tun.

Hier ist etwas ähnlich Ich bin mit dynamisch verschachtelten Eigenschaften zu finden .. Sie addthe Logik für Indexer brauchen würde ... und einige zusätzliche Kontrolle ... Ich fange nulls / Fehler in meiner Rufmethode ...

  public static object FindDottedProperty(this object input, string propertyName)
  {
    if (input == null)
      return null;

    if (string.IsNullOrEmpty(propertyName))
      return null;

    Queue props = new Queue(propertyName.Split('.'));
    if (props.Count == 0) return null;

    //start with input object and roll out property stack from there.
    object ret = input;
    while (props.Count > 0)
    {
      var prop = props.Dequeue();
      if (string.IsNullOrEmpty(prop)) return null;

      /*** ADD INDEXER LOGIC HERE ***/

      //get the property's value based on the current named item
      ret = ret.GetType().GetProperty(prop).GetValue(ret, null);

      if (null.Equals(ret)) return null;
    }

    //return looked up value
    return ret;
  }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top