Je suis en train de créer une méthode d'extension générique, qui fonctionne sur les tables de données typées:Méthode d'extension générique: argument type ne peut être déduit de l'utilisation
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
}
}
La première ligne fonctionne très bien, mais il est vraiment moche ...
La deuxième ligne ne compile pas car le compilateur ne peut pas déduire le type de RowType.
Il s'agit d'une méthode qui sera utilisée en tant que partie d'une couche de données par de nombreux programmeurs différents, donc je préférerais ne pas en avoir besoin pour spécifier le paramètre TypeParameter.
Le compilateur ne devrait-il pas savoir que RowType est du même type que celui qui a été utilisé par TypedTableBase?
Pour différentes raisons qui peuvent ne pas être évidentes dans cet exemple de code, j'ai vraiment besoin de renvoyer le datatable sous sa forme originale. Et la raison pour laquelle j'ai besoin RowType est ainsi le 'Expression <
Func <
T, bool>>
' sera tapé et vu par InteliSence.
Merci
J'avais peur de ça ... merci pour la réponse –
Vous avez raison :) – Brian