首页 > 解决方案 > C# 表达式树,使用具有静态表达式类型的表达式进行 lambda 调用

问题描述

我一直试图在以下代码中使字典值通用。我想Expression用作字典键而不是Expression<Action>. 如果我更改要使用的代码,Expression则会出现错误。如果解决方案涉及,那就太好了,Expression.Convert所以我不会试图Expression通过添加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)));

如果我使用泛型Expression而不是Expression<Action>字典类型,则会出错:

未处理的异常。System.ArgumentException:无法调用“System.Linq.Expressions.Expression”类型的表达式(参数“表达式”)

标签: c#expression-trees

解决方案


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

这是一个无表达式的示例:

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!

推荐阅读