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



在下面的代码中,我一直在努力使字典值通用。我想使用Expression作为字典关键字,而不是Expression<Action>。如果我将代码更改为使用Expression,我会得到一个错误。如果解决方案涉及Expression.Convert,那就太好了,所以我不会试图通过添加Action作为泛型参数来使Expression泛型。

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"类型的表达式(参数"Expression"(

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

下面是一个没有表达式的例子:

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!

相关内容

最新更新