我有以下代码来创建用于访问类
属性的func表达式public static Expression<Func<TObj, TProperty>> BuildGet<TObj, TProperty>(PropertyInfo property)
{
Type type = typeof(TObj);
ParameterExpression arg = Expression.Parameter(type, "x");
var prop = Expression.Property(arg, property);
return Expression.Lambda<Func<TObj, TProperty>>(prop, arg);
}
问题是,我必须传递TObj
和TProperty
,即使它们已知(PropertyInfo
类的属性 - .DeclaringType
和{{1} })。
有没有解决方法,所以我没有明确地传递它们?
返回类型必须保留为.PropertyType
答案 0 :(得分:3)
如果返回类型必须保持Func<TObj, TProperty>
,则该方法必须保持通用。您必须在编译时指定类型。这就是事情 - 虽然PropertyInfo
知道类型,但该信息仅在执行时可用,而编译器需要知道类型信息以检查您是否正在使用该值正确等等。它不可能知道属性的执行时间值是什么。
如果您可以将返回类型更改为Expression
,则可以在执行时创建具有相应类型的Expression<Func<TObj, TProperty>>
,但只需将其作为Expression
返回。如果没有强制转换,您将无法以编译时类型安全的方式使用返回值,但它可能会有所帮助......
答案 1 :(得分:1)
编译器如何推断TObj
的类型?您没有将任何参数传递给该类型的函数。
您可以尝试这样的事情:
public static Expression<Func<TObj, TProperty>> BuildGet<TObj, TProperty>
(TObj obj, TProperty property) { ... }
这将允许编译器推断TObj
和TProperty
的类型,但这意味着您必须重构您的方法,因为您当前正在使用PropertyInfo
参数。