c# - 具有推断泛型参数的泛型方法

标签 c# generics

我有以下代码来创建用于访问类属性的函数表达式

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.PropertyType )。

有没有办法解决这个问题,这样我就不必明确地传递它们?

返回类型必须保持为 Expression<Func<TObj, TProperty>>

最佳答案

如果返回类型必须保持Func<TObj, TProperty>那么该方法必须保持通用。您必须在编译时 指定类型。就是这样-尽管PropertyInfo知道类型,该信息仅在执行时可用,而编译器需要知道类型信息以检查您是否正确使用该值等。它不可能知道属性的执行时间值是多少。

如果您可以将返回类型更改为 Expression那么你可以创建一个 Expression<Func<TObj, TProperty>>在执行时使用适当的类型,但只需将其作为 Expression 返回.如果不强制转换,您将无法以编译时类型安全的方式使用返回值,但这可能会有所帮助...

关于c# - 具有推断泛型参数的泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/835094/

相关文章:

c# - 另一个 Linqification 问题

Java 泛型转换类型不匹配

Java 通配符通用作为 Eclipse 和 SonarQube 中的返回警告

generics - FSharpPlus divRem - 它是如何工作的?

Java,如何将其变成泛型方法?

c# - 批量分组数组

c# - .DLL 库程序集的 .config 文件的用途是什么?

c# - 如何在 ASP.net Core 中创建 "decorator abbreviation"

c# - 如何在unity3d 5.5.3版本中使用SSL协议(protocol)tlsv_1.2?

c# - 什么是 Roslyn 中的 PatternSyntax