类型化和非类型化委托

本文关键字:类型化 | 更新日期: 2023-09-27 17:56:30

两者有什么区别

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");

类型化和非类型化委托

第一个代码是对 Expression.Lambda<TDelegate> 的调用,它返回一个 Expression<TDelegate>,它有一个返回 TDelegateCompile()方法。因此,您情况下的propertyResolver类型是 Func<Person, Object> .

第二个代码是对返回LambdaExpression的非泛型 Expression.Lambda 方法的调用。 这有一个只返回DelegateCompile()方法。因此,您情况下的propertyResolver类型是Delegate - 这就是propertyResolver(p)不会编译的原因。