0

我正在尝试创建一个 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);
}
4

1 回答 1

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"");");
        }
    }
}

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

于 2018-04-02T18:24:38.117 回答