Я пытаюсь создать универсальный метод расширения, который работает на типизированных таблицах данных:
public static class Extensions
{
public static TableType DoSomething<TableType, RowType>(this TableType table, param Expression<Func<RowType, bool>>[] predicates)
where TableType : TypedTableBase<RowType>
where RowType : DataRow
{
// do something to each row of the table where the row matches the predicates
return table;
}
[STAThread]
public static void main()
{
MyTypedDataSet.MyTypedDataTable table = getDefaultTable();
}
public static MyTypedDataSet.MyTypedDataTable getDefaultTable()
{
// this line compiles fine and does what I want:
return new MyTypedDataSet.MyTypedDataTable().DoSomething<MyTypedDataSet.MyTypedDataTable, MyTypedDataSet.MyTypedRow>(row => row.Field1 == "foo");
// this line doesn't compile :
return new MyTypedDataSet.MyTypedDataTable().DoSomething(row => row.Field1 == "foo");
// Error : The type arguments .. cannot be inferred from the usage
}
}
Первая строка работает отлично, но это действительно уродливо...
Вторая строка не компилируется, потому что компилятор не может вывести тип RowType.
Это метод, который будет использоваться как часть DataLayer многими разными программистами, поэтому я бы предпочёл не нуждаться в них, чтобы указать TypeParameter.
Разве компилятор не знает, что RowType - тот же тип, что и тип TypedTableBase?
По разным причинам, которые могут быть не очевидны в этом примере кода, мне действительно нужно вернуть данные в исходной форме. И причина, по которой мне нужен RowType, - это то, что "Expression <
Func <
T, bool > >
" будет набираться и просматриваться InteliSence.
Спасибо