Método de extensão genérico: o argumento de tipo não pode ser deduzido do uso
Estou tentando criar um método de extensão genérico, que funciona em tabelas de dados digitados:
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
}
}
A primeira linha funciona bem, mas é realmente feia ...
A segunda linha não compila porque o compilador não pode inferir o tipo deRowType.
Este é um método que será usado como parte de um DataLayer por muitos programadores diferentes; portanto, prefiro não precisar deles para especificar o TypeParameter.
O compilador não deveria saber queRowType é o mesmo tipo que foi usado pelo TypedTableBase?
Por razões diferentes que podem não ser óbvias neste exemplo de código, eu realmente preciso retornar a tabela de dados em sua forma original. E a razão pela qual eu precisoRowType é a expressão<
Func<
T, bool>>
'será digitado e visto pelo InteliSence.
obrigado