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