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 sp_executeSQL in tsql?Gibt es eine Möglichkeit, eine Zeichenkette in .net, ähnlich wie eval() in Javascript oder dynamischem sql in sql dynamisch auszuführen?
Ich habe einen String-Wert in einer Variablen, die ich irgendwann in meiner Anwendung manipulieren möchte - also würde der Code im Wesentlichen String-Manipulation sein. 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 und einfach genug zu schreiben ist.
Zum Beispiel möchte ich Instanzen von 'ersetzen.' Zeichen mit '-', oder entfernen Sie alle Leerzeichen oder ähnliches. Wenn ich dies in SQL tun würde ich dynamischen SQL verwenden, aber ich will es auszuführen in .net Code, so etwas wie diese:
// Get the value to be manipulated
string s = ... // wherever s comes from
// Get the manipulation code, eg this might come from a database
// setting that can be changed without recompiling the .net code.
string manipulation = Settings.GetSomeValue("ManipulationSetting");
// This is what I want to know how to do: apply some manipulation to the string.
string result = MagicDynamicEvalClass.Eval(manipulation, s);
// Now I would do stuff with the result.
Ich könnte möglicherweise nur Ausdrücke Regex Suchen/Ersetzen. Da ich nur String-Manipulation mache, sollte das ausreichen, vorausgesetzt, ich kann clever genug reguläre Ausdrücke schreiben. zB: ‚‘
// Get the value to be manipulated
string s = ... // wherever s comes from
// Get the code to use to manipulate s, eg this might come from a database
// setting that can be changed without recompiling the .net code.
string findRegex = Settings.GetSomeValue("RegexPattern");
string replaceRegex = Settings.GetSomeValue("RegexReplace");
// This is what I want to know how to do: apply some manipulation to the string.
string result = Regex.Replace(s, findRegex, replaceRegex);
// Now I can do stuff with the result.
Aber in einigen Fällen meine Manipulation Anforderung könnte hinausgehen, was mit regex möglich ist, oder ich könnte mehrere Schritte anwenden möchten, zB ersetzen 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 - zB mit dynamischen SQL
Ich will nicht eine Lösung, die mich im Voraus zu wissen, was erfordert Manipulationen möglich sind, und ich freue mich wirklich für etwas einfach. zB in SQL würde ich so etwas tun:
declare @s nvarchar(1000)
declare @manipulation nvarchar(1000)
declare @result nvarchar(1000)
-- ... Get the values from wherever they come from
-- Execute the manipulation dynamically
EXEC sp_ExecuteSQL @stmt = @manipulation
, @params = N'@s nvarchar(1000), @result nvarchar(1000) OUTPUT'
, @s = @s, @result = @result OUTPUT
Dann könnte ich beliebige SQL in meine @manipulation setzen, so etwas wie dieses SET @result = REPLACE (ERSETZEN (@s, ‚- '' '),' ',' ')
Ja, dies würde erfordern, dass ich vorsichtig bin, welche Werte in @manipulation eingegeben werden dürfen, aber es würde mir die Flexibilität geben, die ich in Zukunft brauche.
Ein ähnlicher Ansatz wäre in Javascript möglich, denke ich, mit eval().
UPDATE - Beispiel mit MSScript Steuerung von .net:
This scheint wie ein möglicher Ansatz, wenn auch vielleicht übertrieben für den einfachen Fall, dass ich mit umgehen will. Es verwendet die Microsoft Script Control-Bibliothek, um die Ausführung von beliebigem VBScript zu ermöglichen.
Bitte tun Sie das nicht. Finden Sie eine andere Technik .... – yfeldblum
Was möchten Sie ausführen? C#? VB.NET? C++/CLI? IronPython? .NET ist keine einzige Sprache, also wie genau sollte es einen String ausführen können? Sie müssen die CodeDom-Funktionalität aufrufen, um auf den Compiler für die gewünschte Sprache zuzugreifen. Sie sollten jedoch einen anderen Ansatz finden. – jalf
@Justice: Ich muss zustimmen, das ist wirklich nur eine schreckliche Idee. – casperOne