有什么区别
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/