C# - 从用户输入字符串动态创建功能主体



我正在尝试创建一个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指令中定义方法实现。

相关内容

  • 没有找到相关文章

最新更新