Я пытаюсь создать универсальный метод расширения, который работает с типизированными таблицами данных:
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?
По разным причинам, которые могут быть не очевидны в этом примере кода, мне действительно нужно вернуть datatable в первоначальном виде. И причина, по которой мне нужно RowType , заключается в том, что 'Expression <
Func <
T, bool> >
' будет напечатан и увиден InteliSence.
Спасибо