C# - 从用户输入字符串动态创建函数体

时间:2018-04-02 17:37:38

标签: c# function user-input runtime-compilation

我正在尝试创建一个C#程序,让用户通过在文本框中输入文本来为函数提供实现。我提供了函数头(输入类型,输出类型),它们只需要提供实际的实现。然后我存储该函数以便稍后调用。他们可能需要从.NET框架中导入一些东西,但除了它之外什么都没有。

我不关心安全性,这只是供内部使用的工具。

在.NET中有一种简单的方法吗?

用法看起来像(需要实现CompileUserFunction函数,它接受一个int并返回一个对象):

Func<int, object> CreateUserFunction(string input) {
    Func<int, object> userFunc = CompileUserFunction(input);
    return (i) => userFunc(i);
}

public void DoSomething() {
    List<Func<int, object>> userFuncs = new List<Func<int, object>>();

    string userInput = @"DateTime t = DateTime.Now; 
                         t.AddDays(i);
                         return t;";

    userFuncs.Add(CreateUserFunction(userInput));
    userFuncs.Add(CreateUserFunction("return i;"));
    userFuncs.Add(CreateUserFunction("i = i * 5; return i;"));
    var result = userFuncs[0](5);
}

1 个答案:

答案 0 :(得分:2)

您可以为该任务使用代码生成库。 我建议你使用Roslyn脚本API。我做了类似的任务 - 用它将字符串解析为委托。以下示例来自此链接:https://blogs.msdn.microsoft.com/csharpfaq/2011/12/02/introduction-to-the-roslyn-scripting-api/ 你会发现更多的例子

using Roslyn.Scripting.CSharp;

namespace RoslynScriptingDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var engine = new ScriptEngine();
            engine.Execute(@"System.Console.WriteLine(""Hello Roslyn"");");
        }
    }
}

还有其他代码生成工具和库: