Próbuję stworzyć ogólną metodę rozszerzenia, które działa na wpisywanych tabel danych:Generic rozszerzenie metoda: Typ argumentu nie można wywnioskować z wykorzystaniem
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
}
}
Pierwsza linia działa dobrze, ale to jest naprawdę brzydki ...
Druga linia nie kompiluje się, ponieważ kompilator nie może wywnioskować typu RowType.
Jest to metoda, która będzie używana jako część DataLayer przez wielu różnych programistów, więc raczej nie będę ich potrzebował do określenia parametru TypeParameter.
Czy kompilator nie powinien wiedzieć, że RowType jest tym samym typem, który został użyty przez TypedTableBase?
Z różnych powodów, które mogą nie być oczywiste w tej próbce kodu, naprawdę muszę zwrócić datatable w pierwotnej formie. A powodem, dla którego potrzebuję RowType, jest wyrażenie "Expression <
Func <
T, bool>>
" i zostanie wyświetlone przez InteliSence.
Dzięki
Bałem się tego ... dzięki za odpowiedź –
Masz rację :) – Brian