Ich stecke an einem Problem fest. Ich habe eine Methode, um die Tabellen abzufragen. Und ich habe Klassen, die die Tabelle repräsentieren, alle von einer Schnittstelle abgeleitet ITable
. Die Methode gibt IEnumerable<ITable>
. Aber ich kann das durch die Rückkehr gegebene Objekt nicht verwenden, hier ist was ich meine:
public interface ITable
{
}
public class table1 : ITable
{
prop1 {get;set;}
}
public class table2 : ITable
{
prop2 {get; set;}
}
public IEnumerable<ITable> GetInfo(string table)
{
switch(table)
{
case "Table1":
var dataTable1 = connection.Query<Table1> ....
return dataTable1;
case "Table2":
var dataTable2 = connection.Query<Table2> ....
return dataTable2;
}
}
static void Main(string[] args)
{
foreach (var table in listOfTable)
{
var data = GetInfo(table);
//data here is "Table" how can i make the mthod to return my Table1 or Table2?
}
}
Wenn Sie die spezifischen Typen kennen müssen, verwenden Sie wahrscheinlich keine Schnittstelle: Sie können Dinge tun wie:
var data = GetInfo(table);
foreach(var item in data)
{
if (item is table1 t1) { /* special code for table1, now held as t1 */ }
else if (item is table2 t2) { /* special code for table2, now held as t2 */ }
else {/* general code for ITable */ }
}
Schwerpunkt: Sie sollten in der Regel vermeiden , um zu wissen , was die spezifische Art in diesem Szenario ist. Es bedeutet, dass Sie nicht wirklich an die Schnittstelle codieren.
Ich schätze, Sie suchen nach einer generischen Möglichkeit, Ihre Datenbank abzufragen, so dass Sie die GetInfo
Methode auf einen Typ beschränken können, der auf ITable
beschränkt ist, und diese Daten einfach ITable
, damit Ihr ITable
die zurückgegebenen Daten verwenden kann, die nun stark typisiert sind , mögen
public IEnumerable<TTableType> GetInfo<TTableType>() where TTableType: ITable {
return Connection.Query<TTableType>();
}
Dies wäre dann für alle Typen aufrufbar, die die ITable
Schnittstelle implementieren.