Question

Comment passez-vous un type de classe dans une fonction en C #?

Alors que je commençais à utiliser db4o et C #, j’ai écrit la fonction suivante après avoir lu les tutoriels:

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

La solution

Il y a deux façons. La première consiste à utiliser explicitement le type.

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

PrintAllPilots(typeof(SomeType),somePath);

La seconde consiste à utiliser des génériques

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

PrintAllPilots<SomeType>(somePath);

Autres conseils

Les réponses données par Jon, Jared et yshuditelu utilisent une requête par exemple qui est en grande partie un mécanisme d’interrogation DB4o inutilisé et qui pourrait potentiellement être obsolète dans le futur.

Les méthodes préférées d'interrogation sur DB4O for .NET sont les requêtes natives et LINQ.

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

Ou utilisez alternativement Linq-to-DB4O:

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

Ces deux types de travail fonctionnent à condition que vous connaissiez le type (par exemple, Pilote) au moment de la compilation. Si vous ne connaissez pas le type au moment de la compilation, vous pouvez utiliser une requête DB4 SODA:

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

modifier Pourquoi utiliser LINQ au lieu de SODA, Requête par exemple (QBE) ou Requête native (NQ)? Parce que LINQ rend très naturel de faire des expressions de requête. Par exemple, voici comment vous interrogez des pilotes nommés Michael:

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

Et LINQ est composable, ce qui signifie que vous pouvez faire les choses suivantes:

var first20MichaelPilots = michaelPilots.Take(20);

Et vous obtiendrez toujours une requête efficace exécutée dans DB4O lorsque vous parcourez les résultats. Faire la même chose dans SODA, QBE ou NQ est au mieux moche.

Je pense que c'est ce que vous voulez:

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

Vous pouvez le faire manuellement à l'aide de type :

public static void PrintAllPilots(Type type, string pathToDb)

Vous pouvez également utiliser des génériques pour en déduire le type:

public static void PrintAllPilots<T>(string pathToDb)
{
   //...
   var result = db.QueryByExample(typeof(T));
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top