Ich versuche, eine generische Erweiterungsmethode zu erstellen, die auf typisierten Datentabellen funktionieren:Generika-Extension-Methode: Typ Argument kann nicht aus der Nutzung abgeleitet wird
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
}
}
Die erste Zeile funktioniert gut, aber es ist wirklich hässlich ...
Die zweite Zeile kompiliert nicht, da der Compiler den Typ RowType nicht ableiten kann.
Dies ist eine Methode, die von vielen verschiedenen Programmierern als Teil eines DataLayers verwendet wird. Daher brauche ich sie nicht, um den TypeParameter anzugeben.
Sollte der Compiler nicht wissen, dass RowType der gleiche Typ ist, der von TypedTableBase verwendet wurde?
Aus verschiedenen Gründen, die in diesem Codebeispiel möglicherweise nicht offensichtlich sind, muss ich die Datentabelle in seiner ursprünglichen Form wirklich zurückgeben. Und der Grund, warum ich brauche RowType ist so die '<
Func <
T, bool>>
' wird getippt und von InteliSence gesehen werden.
Dank
Ich hatte Angst davor ... danke für die Antwort –
Sie haben Recht :) – Brian