Ответ Эрика отлично подходит для объяснения того, почему типы не могут быть выведены. Вот несколько предложений, которые, как мы надеемся, позволят сократить многословность кода, который вам придется написать.
Если вы можете явно определить тип вашего лямбда-выражения, то оно может вывести типы.
Ниже приведен пример того, как это сделать. Я создал параметр criteria
, который явно имеет тип Expression<Func<MyTypedDataSet.MyTypedRow, bool>>
. В этом примере это не сильно экономит время при наборе текста, но, возможно, на практике вы можете использовать это.
MyTypedDataSet.MyTypedDataTable table = new MyTypedDataSet.MyTypedDataTable();
Expression<Func<MyTypedDataSet.MyTypedRow, bool>> criteria = row => row.Field1 == "foo";
return table.DoSomething(criteria);
РЕДАКТИРОВАТЬ: изменил мой пример, чтобы использовать другой метод расширения вместо получения пользовательского TypedTableBase<T>
класса из System.Data.TypedTableBase<T>
.
Ниже приведен еще один пример, который может лучше определить параметры типа. Вы определяете другой метод расширения (мой называется RowPredicate
), который имеет только один параметр типа для вывода. Первый параметр имеет тип TypedTableBase<RowType>
, поэтому у компилятора не должно возникнуть проблем с выводом типа из этого:
public static Expression<Func<RowType, bool>> RowPredicate<RowType>(this TypedTableBase<RowType> table, Expression<Func<RowType, bool>> predicate)
where RowType : DataRow
{
return predicate;
}
Это позволяет вам скомпилировать следующий код:
MyTypedDataSet.MyTypedDataTable table = new MyTypedDataSet.MyTypedDataTable();
return table.DoSomething(table.RowPredicate(row => row.Field1 == "foo"));
В основном параметр table
просто серверы, чтобы сообщить компилятору о типе, используемом для RowType
. Это хорошая идея? Я не уверен, но он позволяет компилятору выводить все обобщенные типы.