具有推断通用参数的通用方法

时间:2009-05-07 14:46:37

标签: c# generics

我有以下代码来创建用于访问类

属性的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);
}

问题是,我必须传递TObjTProperty,即使它们已知(PropertyInfo类的属性 - .DeclaringType和{{1} })。

有没有解决方法,所以我没有明确地传递它们?

返回类型必须保留为.PropertyType

2 个答案:

答案 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) { ... }

这将允许编译器推断TObjTProperty的类型,但这意味着您必须重构您的方法,因为您当前正在使用PropertyInfo参数。