Frage

Wie übergeben Sie einen Klasse-Typen in eine Funktion in C #?

Wie erhalte ich in db4o und C # Ich schrieb die folgende Funktion nach den Anleitungen zu lesen:

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

Lösung

Es gibt zwei Möglichkeiten. Die erste besteht darin, explizit den Typ Typen zu verwenden.

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

PrintAllPilots(typeof(SomeType),somePath);

Die zweite ist Generika verwenden

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

PrintAllPilots<SomeType>(somePath);

Andere Tipps

Die Antworten von Jon, Jared und yshuditelu Verwendung query-by-Beispiel, die DB4O anfragende Mechanismus weitgehend ungenutzt ist und möglicherweise in Zukunft weiterentwickelt werden könnte.

Die bevorzugten Methoden für .NET auf DB4O Abfrage stammen Abfragen und LINQ.

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

oder alternativ mit Linq-to-DB4O:

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

Diese beiden Arbeiten, sofern Sie den Typ kennen (zum Beispiel Pilot) bei der Kompilierung. Wenn Sie nicht die Art zum Zeitpunkt der Kompilierung bekannt ist, können Sie stattdessen eine DB4O SODA-Abfrage verwenden:

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

Bearbeiten Warum verwenden LINQ statt SODA, Query-by-Example (QBE) oder Mutter Query (NQ)? Da LINQ es sehr natürlich macht Abfrageausdrücke zu tun. Zum Beispiel, hier ist, wie Sie für Piloten namens Michael abfragen würde:

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

Und LINQ ist zusammensetzbare, dh Sie können Dinge wie diese tun können:

var first20MichaelPilots = michaelPilots.Take(20);

Und Sie werden noch eine effiziente Abfrage ausgeführt in DB4O erhalten, wenn Sie über die Ergebnisse iterieren. Dadurch könnte die gleiche in SODA oder QBE oder NQ ist besten hässlich.

Ich denke, das ist, was Sie wollen:

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

Sie können entweder es tun manuell durch Type mit:

public static void PrintAllPilots(Type type, string pathToDb)

Oder Sie könnten Generika verwenden, um die Art zu schließen:

public static void PrintAllPilots<T>(string pathToDb)
{
   //...
   var result = db.QueryByExample(typeof(T));
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top