Есть ли способ динамически выполнять код, содержащийся в строке, используя .net 2.0, аналогично eval () в javascript или с помощью sp_executeSQL в tsql?
У меня есть строковое значение в переменной, которым я хочу манипулировать в какой-то момент в моем приложении - поэтому код, по сути, будет манипулировать строками. Я не знаю, какие разные манипуляции понадобятся, поэтому я бы хотел, чтобы они были настраиваемыми.
Мне все равно, на каком языке написан динамический код, какой бы самый простой для реализации и достаточно простой для написания.
Например, я мог бы захотеть заменить экземпляры '.' символ с '-', или исключить все пробелы, или аналогичные. Если бы я делал это в SQL, я бы использовал динамический SQL, но я хочу выполнить его в коде .net, что-то вроде этого:
// 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.
Я мог бы просто использовать регулярные выражения находить / заменять выражения. Поскольку все, что я делаю - это манипулирование строками, этого должно быть достаточно, при условии, что я могу написать достаточно умные регулярные выражения. например:
// 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.
Но в некоторых случаях моё требование к манипуляции может превышать то, что возможно с регулярным выражением, или я могу захотеть применить несколько шагов, например, заменить '.' с '-', а также с пробелами. Возможно, я мог бы сохранить список регулярных выражений поиска / замены и перебрать их ... но у кого-нибудь есть лучшее предложение?
ОБНОВЛЕНИЕ - пример использования динамического sql
Мне не нужно решение, которое требует от меня заранее знать, какие манипуляции возможны, и я действительно ищу что-то простое. например, в sql я бы сделал что-то вроде этого:
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
Тогда я мог бы поместить произвольный sql в мою @manipulation, что-то вроде этого
SET @result = REPLACE (REPLACE (@s, '.', '-'), '', '')
Да, это потребовало бы от меня быть осторожным в отношении того, какие значения разрешено вводить в @manipulation, но это дало бы мне гибкость, которая мне нужна в будущем.
Подобный подход был бы возможен в javascript, я думаю, с использованием eval ().
UPDATE - пример использования элемента управления MSScript из .net:
Этот кажется возможным подходом, хотя, возможно, излишним для простого случая, с которым я хочу иметь дело. Он использует библиотеку Microsoft Script Control для разрешения выполнения произвольного VBScript.