2017-02-16 9 views
1

У меня было определение метода, как это:Дополнительные общие Введенные параметры не могут быть выведены

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); 

Но теперь на стороне клиента, он говорит:

аргументы типа «...» не может быть выведено из использования.

Это имеет смысл, поскольку я не использую необязательные параметры вообще. Когда я даю все параметры, он работает нормально, но опциональность делает его ошибочным.

Создание многих методов с помощью телескопических параметров - выход. Но, должно быть, я должен быть более аккуратным. Как я могу предоставить эту функциональность?

+0

Вы должны идти с 'Params Expression > [] fieldsToExclude' и (предполагая, что это поставщик EntityFramework, с которым вы передаете эти выражения), касаются фактического литья выражения. – haim770

+0

В основном не имеет решения. Типичным обходным решением является использование выражения 'params Expression > []' и обращение к 'Expression.Convert', введенному для типов значений. –

+0

ну, это не EntityFramework провайдер, поэтому мне не нужно иметь дело с типом. Я просто использую имя поля, и на самом деле я не использовал ни одного из 'T'. Следовательно, это должно действительно работать. Вы должны опубликовать его как ответ @ haim770. –

ответ

1

Так как вы можете рассчитаться с вашими выражениями возвращения Object, вы можете просто опустить общий аргумент и использовать Object вместо:

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