Domanda

Come si passa un tipo di classe a una funzione in C #?

Mentre sto entrando in db4o e C # ho scritto la seguente funzione dopo aver letto i tutorial:

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

Soluzione

Ci sono due modi. Il primo è utilizzare esplicitamente il tipo Type.

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

PrintAllPilots(typeof(SomeType),somePath);

Il secondo è usare generici

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

PrintAllPilots<SomeType>(somePath);

Altri suggerimenti

Le risposte fornite da Jon, Jared e yshuditelu usano la query per esempio che è in gran parte un meccanismo di query DB4o inutilizzato e potrebbe potenzialmente essere deprecato in futuro.

I metodi preferiti per eseguire query su DB4O per .NET sono query native e LINQ.

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

O in alternativa usando Linq-to-DB4O:

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

Entrambi questi lavori a condizione che tu conosca il tipo (ad esempio Pilota) al momento della compilazione. Se non si conosce il tipo in fase di compilazione, è possibile invece utilizzare una query SODA DB4O:

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

modifica Perché usare LINQ invece di SODA, Query-by-Example (QBE) o Native Query (NQ)? Perché LINQ rende molto naturale eseguire espressioni di query. Ad esempio, ecco come faresti per i piloti di nome Michael:

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

E LINQ è compostabile, il che significa che puoi fare cose del genere:

var first20MichaelPilots = michaelPilots.Take(20);

E otterrai comunque una query efficiente eseguita in DB4O quando ripeti i risultati. Fare lo stesso in SODA o QBE o NQ è nella peggiore delle ipotesi.

Penso che questo sia quello che vuoi:

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

Puoi farlo manualmente usando Type :

public static void PrintAllPilots(Type type, string pathToDb)

Oppure potresti usare generici per inferire il tipo:

public static void PrintAllPilots<T>(string pathToDb)
{
   //...
   var result = db.QueryByExample(typeof(T));
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top