我正在尝试创建一个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);
}
您可以将代码生成LIB用于该任务。我建议您使用Roslyn脚本API。我已经完成了类似的任务 - 将字符串解析为代表。以下示例是从此链接中获取的:https://blogs.msdn.microsoft.com/csharpfaq/2011/12/02/02/introduction-to-te-the-the-the-the-the-the-the-the-the-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"");");
}
}
}
还有其他代码生成工具和libs:
- 编码 - 一个旧的.NET代码生成框架。可能可以在这里使用,但更棘手。https://learn.microsoft.com/en-us/dotnet/framework/reflection-and-codedom/using-the-codedom
- 有一些用于将字符串转换为linq表达树的库,但现在似乎已经过时了。
- 也有可能通过反射创建动态方法,但它是非常低的水平 - 您需要在IL指令中定义方法实现。