将字符串作为c#代码运行的最佳方法

时间:2014-02-06 23:40:10

标签: c# asp.net-mvc razor

让我说我有:

@{
var str= "DateTime.Now";
}

我想将此字符串作为c#代码

处理
@Html.Raw(App.ProcessAsCode(str));

输出应该是当前日期时间。

2 个答案:

答案 0 :(得分:5)

最终修改:

根据更多信息 - 如果此处的目标是简单地使用格式化引擎,那么有很多选项。一个这样的选项基于shopify(see here)的.liquid语法。你可以在gitHub上找到这个的.NET端口:https://github.com/formosatek/dotliquid/。这样做的主要目的是改变:

 <h2>{{product.name}}</h2>

类似于:

 <h2>Beef Jerky</h2>

我强烈建议您阅读有关液体引擎和语法的更多信息,我相信这会引导您朝着正确的方向前进。祝你好运!


初步回答

这绝对是可能的 - 虽然正如其他人所说的那样,你会想要小心你所做的事情。使用C#,通常编译和运行代码的关键是“CSharpCodeProvider”类。以下是一个简短的示例:

        string[] references = { "System.dll" };
        CompilerParams.ReferencedAssemblies.AddRange(references);

        var provider = new CSharpCodeProvider();
        CompilerResults compile = provider.CompileAssemblyFromSource(CompilerParams, formattedCode);

在此示例中,“formattedCode”是包含C#代码的字符串。必须手动添加任何引用。有关完整示例,请参阅此堆栈问题(How to get a Type from a C# type name string?)。

注意 - 如果你想要做的只是一个格式字符串或类似的东西你可能让用户传入.NET格式的字符串(例如“MM / dd / yyyy” “),然后在调用”ToString“方法时使用它。这将为用户提供一些可配置性,同时仍然确保您的系统保持安全。通常,在未正确检查/转义的服务器上运行代码非常危险!

参考 - 供您参考,CSharpCodeProvider的current msdn page也有一些例子。

答案 1 :(得分:0)

另一个选择是使用动态语言,如IronRuby或IronPython。