代码之家  ›  专栏  ›  技术社区  ›  Node.JS

C#表达式树,使用具有静态表达式类型的表达式进行lambda调用

  •  0
  • Node.JS  · 技术社区  · 5 年前

    在以下代码中,我一直在努力使字典值通用。我想用 Expression 作为字典密钥而不是 Expression<Action> 。如果我更改代码以使用 表达式 我犯了一个错误。如果解决方案包括 Expression.Convert 所以我不会试图做一个 表达式 通过添加通用 Action 作为通用参数。

    Expression<Action> test = () => Console.WriteLine("Hello world");
    
    var dict = new Dictionary<string, Expression<Action>> {["foo"] = test};
    
    var functionDef = Expression.Property(Expression.Constant(dict), "Item", Expression.Constant("foo"));
    
    var intermediate = Expression.Lambda(functionDef);
    
    Expression.Invoke(Expression.Invoke(Expression.Constant(intermediate)));
    

    使用泛型时出错 表达式 而不是 表达式<行动> 作为字典类型:

    未处理的异常。系统。ArgumentException:类型为“System”的表达式。林克。表达。无法调用表达式“”(参数“Expression”)

    0 回复  |  直到 5 年前
        1
  •  -1
  •   tmaj    5 年前

    我不确定你在这里的问题是什么,但也许你不需要表达。

    以下是一个无表达式的示例:

    var d = new Dictionary<string, Action<string>>() 
    {
        { "hello", name => Console.WriteLine($"Hello {name}") },
        { "bye", name => Console.WriteLine($"Bye {name}!. Have a great day!") }
    };
    
    d["hello"]("Node.JS");
    d["bye"]("Node.JS");
    

    此打印:

    Hello Node.JS
    Bye Node.JS!. Have a great day!