有没有办法使用 .net 2.0 以类似于 javascript 中的 eval() 或在 tsql 中使用 sp_executeSQL 的方式动态执行包含在字符串中的代码?
我的变量中有一个字符串值,我想在我的应用程序中的某个时间点进行操作 - 所以代码本质上是字符串操作。我不知道需要什么不同的操作,所以我希望它们是可配置的。
我真的不在乎动态代码是用什么语言编写的,无论哪种语言最容易实现且编写起来足够简单。
例如,我可能想替换 '.' 的实例。带有'-'的字符,或去掉所有空格,或类似的。如果我在 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() 也可以使用类似的方法。
更新 - 使用 .net 中的 MSScript 控件的示例:
这似乎是一种可能的方法,尽管对于我想要处理的简单案例来说可能有点矫枉过正。它使用 Microsoft Script Control 库来允许执行任意 VBScript。