【问题标题】:Optional generic typed parameters cannot be inferred无法推断可选的泛型类型参数
【发布时间】:2017-02-16 08:43:11
【问题描述】:

我有一个这样的方法定义:

public List<TEntity> GetAll<T> (
    params Expression<Func<TEntity, T>>[] fieldsToExclude )
{
    ...
}

但是当我这样做时,我不能有不同的类型。

所以我把它改成了这样:

public List<TEntity> GetAll<T1, T2, T3, T4, T5, T6, T7, T8> (
    Expression<Func<TEntity, T1>> field1ToExclude,
    Expression<Func<TEntity, T2>> field2ToExclude = null,
    Expression<Func<TEntity, T3>> field3ToExclude = null,
    Expression<Func<TEntity, T4>> field4ToExclude = null,
    Expression<Func<TEntity, T5>> field5ToExclude = null,
    Expression<Func<TEntity, T6>> field6ToExclude = null,
    Expression<Func<TEntity, T7>> field7ToExclude = null,
    Expression<Func<TEntity, T8>> field8ToExclude = null )
{
    ...
}

我尝试像这样使用它:

var allItems = GetAll(p => p.SomeProperty1, p => p.SomeProperty2);

但现在在客户端它说:

类型参数“...”不能从用法中推断出来。

这是有道理的,因为我根本不使用可选参数。当我提供所有参数时,它工作正常,但可选性使其错误。

使用伸缩参数创建许多方法是一种出路。但我想也必须有一个更整洁的方法。如何提供此功能?

【问题讨论】:

  • 您必须使用 params Expression&lt;Func&lt;TEntity, Object&gt;&gt;[] fieldsToExclude 并且(假设您将这些表达式传递给它的 EntityFramework 提供程序)处理实际的表达式类型转换。
  • 基本没有解决办法。典型的解决方法是使用params Expression&lt;Func&lt;TEntity, object&gt;&gt;[] 并处理为值类型引入的Expression.Convert
  • 好吧,它不是 EntityFramework 提供者,因此我不必处理类型转换。我只使用了该字段的名称,实际上并没有使用任何Ts。因此,这实际上应该有效。您应该将其发布为答案@haim770。
  • 顺便说一句,调用GetAll 方法然后将你想要的东西传递给它是非常不直观的。考虑类似GetAllWithExcludedProperties
  • 这是一个建设性的批评@JeroenMostert,谢谢。

标签: c# generics optional-parameters


【解决方案1】:

由于您可以通过返回 Object 的表达式来解决问题,因此您可以简单地省略通用参数并改用 Object

public List<TEntity> GetAll<TEntity> (params Expression<Func<TEntity, Object>>[] fieldsToExclude)
{
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 2012-02-20
    • 1970-01-01
    相关资源
    最近更新 更多