我正在尝试创建一个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);
}
答案 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"");");
}
}
}
还有其他代码生成工具和库: