Wie kann ich auswerten C# code dynamisch?
Kann ich tun, eine eval("something()");
Ausführung von code dynamisch in JavaScript. Gibt es eine Möglichkeit für mich, das gleiche zu tun, was in C#?
Ein Beispiel, was ich versuche zu tun, ist: ich habe eine integer-variable (sagen i
) und ich haben mehrere Eigenschaften, die durch die Namen: "Eigenschaft1", "Eigenschaft2", "Property3", etc.
Nun, ich möchte, um einige Operationen durchzuführen, die auf die "Eigenschaftich" - Eigenschaft ist abhängig vom Wert des i
.
Ist das Recht einfach mit Javascript. Gibt es eine Möglichkeit, dies zu tun mit C#?
Werfen Sie einen Blick auf Mono-CSharp-interaktive shell. Es eval-Funktionen wie.
c# aufrufen der ironpython-eval. Ich habe versucht, es in c# 4.0. keine Erfahrung mit c# 2.0
Lange, wo finde ich Unterlagen über die IronPython-eval ?
Ich weiß, dass dieses Q&A ist ziemlich altmodisch, aber ich habe soeben eine video-Playlisten , klingt eine ganze Menge, wie der Beschreibung in Davide Icardi Antwort. Es ist völlig anders, und wahrscheinlich lohnt sich.
c# aufrufen der ironpython-eval. Ich habe versucht, es in c# 4.0. keine Erfahrung mit c# 2.0
Lange, wo finde ich Unterlagen über die IronPython-eval ?
Ich weiß, dass dieses Q&A ist ziemlich altmodisch, aber ich habe soeben eine video-Playlisten , klingt eine ganze Menge, wie der Beschreibung in Davide Icardi Antwort. Es ist völlig anders, und wahrscheinlich lohnt sich.
InformationsquelleAutor Adhip Gupta | 2008-08-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider ist C# nicht eine dynamische Sprache wie die.
Was Sie jedoch tun können, ist das erstellen einer C# - Quellcode-Datei, voll mit Klasse und alles, und führen Sie es durch die CodeDom-Anbieter für C# und kompilieren Sie es in eine assembly, und führen Sie es aus.
In diesem forum-Beitrag auf MSDN enthält eine Antwort mit einigen Beispiel-code unten auf der Seite etwas:
erstellen Sie eine anonyme Methode von einem string?
Ich würde kaum sagen, das ist eine sehr gute Lösung ist, aber es möglich ist, sowieso.
Welche Art von code sind Sie gehen zu erwarten, dass in diesem string? Wenn es eine kleinere Teilmenge von gültigen code, zum Beispiel nur mathematische Ausdrücke, könnte es sein, dass andere alternativen gibt.
Bearbeiten: Naja, das lehrt mich Lesen Sie die Fragen gründlich erste. Ja, Reflexion wäre in der Lage, Ihnen helfen, einige hier.
Wenn Sie split den string mit den ; ersten, individuellen Eigenschaften, Sie können den folgenden code verwenden, um ein PropertyInfo-Objekt für eine bestimmte Eigenschaft für eine Klasse, und verwenden Sie dann das Objekt zu manipulieren, um ein bestimmtes Objekt.
Link: PropertyInfo.SetValue-Methode
InformationsquelleAutor Lasse Vågsæther Karlsen
Verwendung des Roslyn-scripting-API (mehr samples hier):
Können Sie auch jedes Stück code:
- Und Referenz-code, der generiert wurde, in früheren Auflagen:
InformationsquelleAutor Eli Arbel
Nicht wirklich. Sie können verwenden Sie reflektion, um zu erreichen, was Sie wollen, aber es nicht annähernd so einfach wie in Javascript. Zum Beispiel, wenn Sie wollte, um den privaten Bereich ein Objekt, etwas zu, Sie könnte verwenden Sie diese Funktion:
InformationsquelleAutor Karl Seguin
Dies ist eine Funktion eval unter c#. Ich benutzte es, um zu konvertieren anonyme Funktionen (Lambda-Ausdrücke) aus einem string.
Quelle: http://www.codeproject.com/KB/cs/evalcscode.aspx
Ich konnte nicht verstehen, warum diese Antwort bekommen weniger Stimmen. Es ist sehr nützlich.
InformationsquelleAutor Largo
Ich geschrieben habe, eine open-source-Projekt, Dynamische Expresso, dass umwandeln können text-expression geschrieben, mit C# - syntax, die in Delegierten (oder expression tree). Ausdrücke geparst und umgewandelt in Ausdruck Bäume, ohne mit der Kompilierung oder der Reflexion.
Schreiben Sie etwas wie:
oder
Meine Arbeit basiert auf Scott Gu Artikel http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx .
InformationsquelleAutor Davide Icardi
All das würde auf jeden Fall funktionieren. Persönlich, für das spezielle problem, ich würde wahrscheinlich ein wenig anders Vorgehen. Vielleicht so etwas wie dieses:
Bei der Verwendung von mustern wie diesem, Sie müssen vorsichtig sein, dass Ihre Daten gespeichert werden, per Referenz und nicht als Wert. In anderen Worten, tun Sie das nicht mit primitiven. Verwenden Sie Ihre großen aufgeblähten Klasse Kollegen.
Erkannte ich, dass das nicht ganz die Frage, aber wurde die Frage ziemlich gut beantwortet, und ich dachte vielleicht ein anderer Ansatz könnte helfen.
InformationsquelleAutor MojoFilter
Ich jetzt nicht, wenn Sie unbedingt wollen, führen Sie C# - Anweisungen, sondern Sie können bereits mit der Ausführung von Javascript-Anweisungen in C# 2.0. Die open-source-Bibliothek Jint ist in der Lage, es zu tun. Es ist ein Javascript-interpreter für .NET. Übergeben Sie ein Javascript-Programm, und es wird in Ihrer Anwendung. Sie können sogar übergeben C# - Objekt als Argumente und tun automation.
Auch wenn Sie nur wollen, zu bewerten und Ausdruck auf Ihre Eigenschaften geben versuchen,NCalc.
InformationsquelleAutor Sébastien Ros - MSFT
Können Sie verwenden Sie reflektion, um die Eigenschaft und rufen Sie die Vervollständigung auf. So etwas wie dieses:
Ist, vorausgesetzt, das Objekt, das die Eigenschaft hat, wird als "theObject" 🙂
InformationsquelleAutor David Wengier
Sie auch umsetzen konnte ein Webbrowser, laden Sie dann eine html-Datei, welche enthält javascript.
Dann u gehen für die
document.InvokeScript
Methode, die auf diesen browser. Der Rückgabewert der eval-Funktion können verarbeitet und konvertiert in alles, was Sie brauchen.Habe ich diese in mehrere Projekte und es funktioniert perfekt.
Hoffe es hilft
InformationsquelleAutor Xodem
Könnte man es machen, mit einem Prototyp-Funktion:
und so weiter...
InformationsquelleAutor GateKiller
Verwendet reflektion, um zu analysieren und zu bewerten, ein data-binding-Ausdrucks für ein Objekt zur Laufzeit.
DataBinder.Eval-Methode
InformationsquelleAutor Jan Bannister
Ich geschrieben habe, ein Paket, SharpByte.Dynamische, um die Aufgabe zu vereinfachen kompilieren und ausführen von code dynamisch. Der code aufgerufen werden können, die auf jedem Kontext-Objekt mit Erweiterung Methoden wie im weiteren beschrieben hier.
Beispielsweise
gibt 3;
gibt die Kontext-Objekts string-Darstellung;
läuft diese Anweisungen als Skript, etc.
Ausführbaren Dateien bekommen kann leicht über eine factory-Methode, wie im Beispiel hier--alles, was Sie brauchen, ist der source code und die Liste der erwarteten benannte Parameter (Token eingebettet sind mittels triple-Klammer-notation, wie {{{0}}}, zur Vermeidung von Kollisionen mit string.Format () - sowie LENKER-ähnliche Syntax):
Jedes ausführbare Objekt (Skript oder Ausdruck) thread-sicher ist, können gespeichert und wiederverwendet, Protokollierung unterstützt von einem Skript, speichert timing-Informationen und Letzte Ausnahme, wenn Sie Ihr begegnen, usw. Es gibt auch eine Copy () - Methode kompiliert, der auf jedem zu erlauben das erstellen von Billig-Kopien, d.h. durch ein ausführbares Objekt zusammengestellt aus einem Skript oder Ausdruck, der als Vorlage zum erstellen anderer.
Overhead die Ausführung einer bereits kompilierten Skript oder eine Anweisung ist relativ gering, auch unter einer Mikrosekunde auf bescheidene hardware, und bereits kompilierten Skripte und Ausdrücke werden im Cache für die Wiederverwendung.
InformationsquelleAutor Iucounu
Ich habe versucht, den Wert einer Struktur (Klasse) die durch Ihren Namen. Die Struktur war nicht dynamisch. Alle Antworten hat nicht funktioniert, bis ich es endlich geschafft:
Diese Methode gibt den Wert der member durch Ihren Namen. Es funktioniert auf regelmäßige Struktur (Klasse).
InformationsquelleAutor Ilya Dan
Könnten Sie überprüfen die Heleonix.Reflexion Bibliothek. Es stellt Methoden get - /set - /invoke-Mitglieder, die dynamisch, einschließlich verschachtelter Mitglieder, oder wenn ein Mitglied klar definiert ist, können Sie erstellen, getter/setter (lambda zusammengestellt, in ein Delegierter), die ist schneller als die Reflexion:
Oder wenn die Anzahl der Eigenschaften ist nicht endlos, Sie können generieren setter und chache (setter sind schneller, da Sie kompiliert sind Delegierte):
Setter kann der Typ
Action<object, object>
aber Instanzen können unterschiedlich sein, zur Laufzeit, so können Sie Listen erstellen, setter.InformationsquelleAutor Hennadii Lutsyshyn
Leider ist C# keine native Einrichtungen für die genau das tun, was Sie Fragen.
Aber meine C# eval-Programm erlaubt die Auswertung von C# - code. Es stellt für die Bewertung von C# - code zur Laufzeit und unterstützt viele C# - Anweisungen. In der Tat, dieser code ist verwendbar innerhalb einer .NET-Projekt, aber es beschränkt sich auf die Verwendung der C# - syntax. Haben Sie einen Blick auf meine website, http://csharp-eval.com für weitere details.
InformationsquelleAutor xnaterm
die richtige Antwort ist, dass Sie brauchen, um cache aller das Ergebnis zu halten, die mem0ry Nutzung gering.
einem Beispiel würde das wie folgt Aussehen
und hinzufügen zu einer Liste
speichern der id und verwenden Sie es in den code
hoffe, das hilft
jemand verwechselt die Auswertung mit lookup. Wenn Sie wissen, alle möglichen Programme (ich denken, mindestens NP-Hart)... und Sie haben supermachine zur precompile-alle möglichen Ergebnisse... und es sind keine Nebeneffekte/externe Eingänge... Ja, diese Idee theoretisch funktioniert. Der code ist eine große syntax-Fehler, obwohl
InformationsquelleAutor roft