键入和无类型的委托

时间:2014-04-03 14:00:23

标签: 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);

在第二种情况下,有某种“无类型”代表。

那是什么?

编辑:

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

1 个答案:

答案 0 :(得分:1)

第一个代码是对Expression.Lambda<TDelegate>的调用,该调用返回Expression<TDelegate>,其Compile()方法返回TDelegate。因此,您的propertyResolver类型为Func<Person, Object>

第二个代码是对非通用Expression.Lambda方法的调用,该方法返回LambdaExpression。这有Compile()方法只返回Delegate。因此,您的propertyResolver类型为Delegate - 这就是propertyResolver(p)无法编译的原因。