c# - 类型化和非类型化委托(delegate)

标签 c# lambda

有什么区别

var propertyResolver = Expression.Lambda<Func<Person, object>>(expr, arg).Compile();
string name = (string)propertyResolver(p);

var propertyResolver = Expression.Lambda(expr, arg).Compile();
string name = (string)propertyResolver(p);

在第二种情况下,存在某种“无类型”委托(delegate)。

那是什么?

编辑:

ParameterExpression arg = Expression.Parameter(p.GetType(), "x");
Expression expr = Expression.Property(arg, "Name");

最佳答案

第一个代码是对 Expression.Lambda<TDelegate> 的调用,它返回一个 Expression<TDelegate> ,它有一个 Compile() 方法返回 TDelegate .所以 propertyResolver 的类型在你的情况下是 Func<Person, Object> .

第二个代码是对非泛型 Expression.Lambda 的调用返回 LambdaExpression 的方法.这有一个 Compile() 只返回 Delegate 的方法.所以 propertyResolver 的类型在你的情况下是 Delegate - 这就是为什么 propertyResolver(p)不会编译。

关于c# - 类型化和非类型化委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22840067/

相关文章:

c# - HttpContext.Current.Session 给出 StackOverflowException?

c# - 是否有不使用连续内存的开源 MemoryStream 实现?

c++ - 在 lambda 中捕获 std::function 对象

c# - 在 C# 中解决此问题的最佳线程方法是什么?

c# - 单元测试未显示为覆盖方法

c++ - lambda 调用另一个外部 lambda

c# - 将 lambda 表达式作为参数传递给方法?

java - 在 lambda 中抛出异常不起作用

python - 使用 lambda 函数更改属性的值

c# - 使用 DropdownListFor - 使用 Jquery 设置值,也显示在控制台中,但在 Controller 处为 Null