类型化和非类型化委托
本文关键字:类型化 | 更新日期: 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>
,它有一个返回 TDelegate
的Compile()
方法。因此,您情况下的propertyResolver
类型是 Func<Person, Object>
.
第二个代码是对返回LambdaExpression
的非泛型 Expression.Lambda
方法的调用。 这有一个只返回Delegate
的Compile()
方法。因此,您情况下的propertyResolver
类型是Delegate
- 这就是propertyResolver(p)
不会编译的原因。