C # devuelve un objeto diferente y lo usa

c# dapper

Pregunta

Estoy atascado en un problema. Tengo un método para consultar las tablas. Y tengo clases que representan la tabla, todas ellas derivan de una interfaz ITable . El método devuelve IEnumerable<ITable> . Pero no puedo usar el objeto dado por la devolución, esto es lo que quiero decir:

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?
    }
}

Respuesta aceptada

Si necesita conocer los tipos específicos, entonces probablemente no esté haciendo un buen uso de una interfaz: puede hacer cosas como:

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 */ }
}

Énfasis: por lo general, debe evitar la necesidad de saber cuál es el tipo específico en este escenario. Significa que en realidad no estás codificando en la interfaz.


Respuesta popular

Supongo que está buscando una forma genérica de consultar su base de datos, por lo que podría cambiar el método GetInfo para tomar un tipo restringido a ITable y simplemente devolver esos datos, de modo que su consumidor pueda utilizar los datos devueltos que ahora se escribirían fuertemente. , me gusta

public IEnumerable<TTableType> GetInfo<TTableType>() where TTableType: ITable {
  return Connection.Query<TTableType>();
}

Esto podría llamarse para todos los tipos que implementan la interfaz ITable .



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué