Pregunta

¿Cómo se pasa un tipo de clase a una función en C #?

Como me estoy metiendo en db4o y C # escribí la siguiente función después de leer los tutoriales:

    public static void PrintAllPilots("CLASS HERE", string pathToDb)
    {
        IObjectContainer db = Db4oFactory.OpenFile(pathToDb);
        IObjectSet result = db.QueryByExample(typeof("CLASS HERE"));
        db.Close();
        ListResult(result);
    }
¿Fue útil?

Solución

Hay dos formas. El primero es usar explícitamente el tipo Tipo.

public static void PrintAllPilots(Type type, string pathToDb)
{
  ...
  IObjectSet result = db.QueryByExample(type);
}

PrintAllPilots(typeof(SomeType),somePath);

El segundo es usar genéricos

public static void PrintAllPilots<T>(string pathToDb)
{
  ...
  IObjectSet result = db.QueryByExample(typeof(T));
}

PrintAllPilots<SomeType>(somePath);

Otros consejos

Las respuestas dadas por Jon, Jared e yshuditelu utilizan consulta por ejemplo, que es un mecanismo de consulta DB4o en gran parte no utilizado, y que podría ser obsoleto en el futuro.

Los métodos preferidos para consultar DB4O para .NET son las consultas nativas y LINQ.

// Query for all Pilots using DB4O native query:
var result = db.Query<Pilot>();

O alternativamente usando Linq-to-DB4O:

// Query for all Pilots using LINQ
var result = from Pilot p in db
             select p;

Ambos trabajos siempre que sepas el tipo (por ejemplo, Pilot) en tiempo de compilación. Si no conoce el tipo en el momento de la compilación, puede utilizar una consulta DB4O SODA:

var query = db.Query();
query.Constrain(someObj.GetType());
var results = query.Execute();

edit ¿Por qué usar LINQ en lugar de SODA, Query-by-Example (QBE) o Native Query (NQ)? Porque LINQ hace que sea muy natural hacer expresiones de consulta. Por ejemplo, así es como consultaría a los pilotos llamados Michael:

var michaelPilots = from Pilot p in db
                    where p.Name == "Michael"
                    select p;

Y LINQ es componible, lo que significa que puede hacer cosas como esta:

var first20MichaelPilots = michaelPilots.Take(20);

Y aún obtendrá una consulta eficiente ejecutada en DB4O cuando itere sobre los resultados. Hacer lo mismo en SODA o QBE o NQ es feo en el mejor de los casos.

Creo que esto es lo que quieres:

public static void PrintAllPilots(Type classType, string pathToDb)
{
    IObjectContainer db = Db4oFactory.OpenFile(pathToDb);
    IObjectSet result = db.QueryByExample(classType);
    db.Close();
    ListResult(result);
}

Puede hacerlo manualmente usando Tipo :

public static void PrintAllPilots(Type type, string pathToDb)

O podría usar genéricos para inferir el tipo:

public static void PrintAllPilots<T>(string pathToDb)
{
   //...
   var result = db.QueryByExample(typeof(T));
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top