Gibt es eine Möglichkeit, Code, der in einer Zeichenfolge enthalten ist, mit .net 2.0 dynamisch auszuführen, ähnlich wie eval () in JavaScript oder mit sp_executeSQL in tsql?
Ich habe einen String-Wert in einer Variablen, die ich irgendwann in meiner Anwendung manipulieren möchte - also wäre der Code im Wesentlichen eine String-Manipulation. Ich weiß nicht, welche verschiedenen Manipulationen benötigt werden, also möchte ich, dass sie konfigurierbar sind.
Es ist mir egal, in welcher Sprache der dynamische Code geschrieben ist, was am einfachsten zu implementieren ist und einfach genug zum Schreiben.
Ich möchte zum Beispiel Instanzen von '.' Zeichen mit '-', oder entfernen Sie alle Leerzeichen oder ähnliches. Wenn ich dies in sql tun würde, würde ich dynamisches sql verwenden, aber ich möchte es in .net-Code ausführen, etwa so:
%Vor%Ich könnte möglicherweise nur regex find / replace Ausdrücke verwenden. Da ich nur String-Manipulation mache, sollte das ausreichen, vorausgesetzt, ich kann clever genug reguläre Ausdrücke schreiben. zB:
%Vor%Aber in einigen Fällen übersteigt meine Manipulationsanforderung möglicherweise das, was mit Regex möglich ist, oder ich möchte mehrere Schritte anwenden, z. B. "." mit '-' und strip spaces. Vielleicht könnte ich eine Liste von Regexes zum Suchen / Ersetzen speichern und darüber iterieren ... aber jeder hat einen besseren Vorschlag?
UPDATE - Beispiel mit dynamischen SQL
Ich möchte keine Lösung, bei der ich im Voraus wissen muss, welche Manipulationen möglich sind, und ich suche wirklich etwas Einfaches. zB in sql würde ich so etwas machen:
%Vor%Dann könnte ich beliebig sql in meine @manipulation schreiben, so etwas SET @result = ERSETZEN (ERSETZEN (@s, '.', '-'), '', '')
Ja, dazu müsste ich vorsichtig sein, welche Werte in @manipulation eingegeben werden dürfen, aber das würde mir die Flexibilität geben, die ich in Zukunft brauche.
Ein ähnlicher Ansatz wäre in Javascript möglich, benutze eval ().
UPDATE - Beispiel mit MSScript-Steuerelement von .net:
Dieses scheint ein möglicher Ansatz zu sein, obwohl vielleicht zu viel für den einfachen Fall, mit dem ich mich befassen möchte . Es verwendet die Microsoft Script Control-Bibliothek, um die Ausführung von beliebigem VBScript zu erlauben.
Wie bereits erwähnt, ist es nicht wirklich möglich, c # in einer eval () Funktion zu kompilieren. diese funktionalität ist für eine spätere release der clr geplant, die anders auf der PDC vorgeführt hat.
als eine andere Lösung, wenn Ihre Anwendung in der Lage ist, auf Mono zu laufen, können Sie einfach ihre Eval-Funktion verwenden, die c # code, genau wie Javascript, dynamisch kompilieren kann. Es tut im Grunde bereits, was .net in einem Jahr oder zwei tun kann.
als Alternative, wenn du mono nicht benutzen kannst, könntest du den Teil schreiben, der die Stringmanipulation in ironruby mit eval () durchführt. Der Rest Ihres Codes wird nicht einmal wissen, dass Sie Ruby für diese Klasse / Assambly verwenden.
Der Link, den Sie im Update gepostet haben, sieht für einen so einfachen Anwendungsfall ziemlich kompliziert aus. Mit IronRuby müsste man nur die MyDynamicEvalClass schreiben:
%Vor%und ersetzen "ManipulationSetting" mit etwas Ruby-Code, der eine neue Zeichenfolge
zurückgibtEs ist nicht zu schwer;) Ich habe ein kleines Beispiel zusammengestellt. Dies sollte Ihnen helfen zu entscheiden, ob Sie dynamische Skripte oder Regexes verwenden möchten.
Sie können eine Schnittstelle in Ihrer Assembly erstellen, die Ihr dynamischer Code implementiert:
%Vor%Erstellen Sie anschließend eine ScriptRunner-Klasse:
%Vor%}
Nun müssen Sie nur noch eine Skript-Zeichenfolge mit Code erstellen, der Ihre Schnittstelle wie folgt implementiert.
%Vor%und dann .. in Ihrem Code, verwenden Sie den ScriptRunner, um Ihre Zeichenfolge mit Ihrem dynamischen Code zu verarbeiten:
%Vor%Ich weiß, dass Sie nach C # sind, aber der Code, den ich dafür habe, ist in VB. Sie können es einfach mit dem VB-zu-C # -Konverter von Developer Fusion übersetzen. Ich habe es in einem Projekt verwendet, um es Benutzern zu ermöglichen, zur Laufzeit komplexe Berechnungen in ihre Anwendung einzufügen. Er kompiliert ihren VB-Code in eine Bibliothek im Speicher und führt dann den Code aus, der die resultierende Ausgabe zurückgibt. Es könnte relativ leicht für das, was Sie tun wollen, wieder verwendet werden.
%Vor%Ich habe meinen dynamischen Code wie folgt eingerichtet:
%Vor%Und dann einige Argumente für den Ausdruck einrichten und ausführen:
%Vor%Ich denke, es ist möglich, reflection.emit und codedom zu benutzen, aber das ist überhaupt nicht trivial und ich rate davon ab.
Alternativ könnten Sie versuchen, eine Format-Zeichenfolge zu konfigurieren, möglicherweise zusätzlich zu der Regex.
Wie wäre es mit meiner Lösung für Eval
?Wie wird der String-Pfad auf dem dynamischen Typ ausgeführt?
Sie können zwar eine Enumeration verwenden, um die gewünschte Aktion anzugeben, oder CodeDom verwenden, um Code dynamisch zu verteilen. Es kommt jedoch darauf an, dass Sie eine Art von Transformation definieren möchten. und eine Ausgabe.
Das Ausgeben der Ausgabe ist in diesem Fall einfach, Sie haben eine Zeichenfolge. Für die Eingaben scheint es, als könnten Sie eine variable Anzahl von Eingängen haben. Das wäre definiert als IEnumerable<string>
.
In diesem Sinne können Sie eine Schnittstelle wie folgt definieren:
%Vor%Dann wäre es einfach, Implementierungen dieses Typs zu definieren und dann die Typnamen in Ihrer Konfiguration zu speichern.
Sie wirklich möchten dies tun, anstatt Code dynamisch aus Strings zu kompilieren. Bei der Verwendung von Zeichenfolgen haben Sie eine große Flexibilität, ja, aber Sie haben keine Kompilierzeitüberprüfung und öffnen sich für Fehler und Sicherheitsprobleme.
Auch die Zeit, die benötigt wird, um ein Stück Code zu schreiben, um Code basierend auf dem von Ihnen bereitgestellten String-Fragment zu emittieren, wird ebenfalls ziemlich mühsam sein, da Sie die Assembly, die Klasse, die Methode erstellen müssen , dann kompiliere und rufe dann die Methode, die du dynamisch kompilierst, durch Reflektion auf (es sei denn, du implementierst eine Schnittstelle, in diesem Fall könntest du genauso gut tun, was ich vorschlage).
Ich bin gerade neulich auf etwas gestoßen, das genau das in einer anderen .NET-Sprache tut: Ссылка
Ich könnte mir vorstellen, dass Sie Ihren Code für die String-Verarbeitung in nemerle schreiben, kompilieren und von Ihrer C # - oder VB-App aus referenzieren könnten.
Ich würde immer noch ein erweiterbares Design bevorzugen, wie es casperOne vorschlägt. Wenn Sie dynamisches Scripting durchführen, werden Sie lediglich die Kompilierung in die App pushen und die Implementierung in den jeweiligen Prozess die Programmierzeichenfolgen an die App senden. Aber es hört sich an, als hätten Sie Ihre Gründe, also ist die einzige andere Sache, die ich hier betrachten würde, Sicherheit. Im Idealfall möchten Sie den Benutzer so stark wie möglich auf nur Manipulieren von Strings beschränken. In diesem Fall scheint List-of-Regex eine ziemlich gute Option zu sein.
Es gibt keine eingebaute C # -Methode zum Aufrufen von eval () zur Laufzeit.
Allerdings ermöglicht mein C # eval-Programm die Auswertung von C # -Code. Es ermöglicht die Auswertung von C # -Code zur Laufzeit und unterstützt viele C # -Anweisungen. Tatsächlich ist dieser Code in jedem .NET-Projekt verwendbar, ist jedoch auf die Verwendung von C # -Syntax beschränkt. Weitere Informationen finden Sie auf meiner Website Ссылка .