我有以下代码来创建用于访问类属性的函数表达式
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
和 .PropertyType
)。
有没有办法解决这个问题,这样我就不必明确地传递它们?
返回类型必须保持为 Expression<Func<TObj, TProperty>>
最佳答案
如果返回类型必须保持Func<TObj, TProperty>
那么该方法必须保持通用。您必须在编译时 指定类型。就是这样-尽管PropertyInfo
知道类型,该信息仅在执行时可用,而编译器需要知道类型信息以检查您是否正确使用该值等。它不可能知道属性的执行时间值是多少。
如果您可以将返回类型更改为 Expression
那么你可以创建一个 Expression<Func<TObj, TProperty>>
在执行时使用适当的类型,但只需将其作为 Expression
返回.如果不强制转换,您将无法以编译时类型安全的方式使用返回值,但这可能会有所帮助...
关于c# - 具有推断泛型参数的泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/835094/