【问题标题】:Create a Func<> with Roslyn使用 Roslyn 创建 Func<>
【发布时间】:2014-03-18 23:11:48
【问题描述】:

thisthis 文章的启发,我正在尝试使用 Roslyn 创建一个动态函数。

但是,上述来源已过时或不完整,我无法创建功能示例。到目前为止我的工作:

var code = @"Func<int, int> doStuffToInt = i =>
{
   var result = i;
   for (var y = i; y <= i * 2; y++)
   {
      result += y;
   }
   return result;
};";


var se = new ScriptEngine();
var session = se.CreateSession();
session.AddReference(typeof(Program).Assembly);
session.AddReference(typeof(Expression).Assembly);

session.ImportNamespace("System");
session.ImportNamespace("System.Linq");
session.ImportNamespace("System.Linq.Expressions");

var submission = session.CompileSubmission<Func<int, int>>(code);

Func<int, int> myFunc =  submission.Execute();

但是myFunc 始终为空,我无法确定问题出在哪里。有人可以帮我运行这个示例吗?

【问题讨论】:

    标签: c# .net roslyn


    【解决方案1】:

    免责声明:我实际上并没有在愤怒中使用过罗斯林。

    目前您的代码声明了一个变量,但之后不做任何事情。基于this random blog post,看起来您可能只需要在声明后添加一个额外的表达式:

    var code = @"Func<int, int> doStuffToInt = i =>
    {
       var result = i;
       for (var y = i; y <= i * 2; y++)
       {
          result += y;
       }
       return result;
    };
    doStuffToInt"; // This is effectively the return statement for the script...
    

    我不保证它会起作用,但请试一试:)

    【讨论】:

    • 我很困惑。最后一行是doStuffToInt,那不应该是对func的调用吗,比如doStuffToInt(1);之类的?
    • @HighCore:不,因为OP希望结果​​是函数本身,而不是调用函数的结果。
    • @ChrisBallard:需要分号 - 我们正在为 code 变量分配一个值(字符串引用)。整个代码 sn-p 只是普通的 C#。
    • @JonSkeet AAAHH... 没错,就像return doStuffToInt; - 我现在明白了。
    • 因为怀疑 Jon Skeet 而羞愧地低下了头 :)
    猜你喜欢
    • 1970-01-01
    • 2012-02-25
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 2018-06-21
    • 1970-01-01
    相关资源
    最近更新 更多