Pergunta

Como você passar um tipo de classe para uma função em C #?

Como estou recebendo em db4o e C # Eu escrevi a seguinte função depois de ler os tutoriais:

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

Solução

Existem duas maneiras. A primeira é usar explicitamente o tipo Type.

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

PrintAllPilots(typeof(SomeType),somePath);

O segundo é genéricos de uso

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

PrintAllPilots<SomeType>(somePath);

Outras dicas

As respostas dadas pelos por Jon, Jared, e yshuditelu uso consulta por exemplo, que é em grande parte não utilizada DB4O mecanismo de consulta, e poderia potencialmente ser obsoleto no futuro.

Os métodos preferidos de consultando DB4O for .NET é consultas nativas e LINQ.

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

Ou, alternativamente usando Linq-to-DB4O:

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

Ambos trabalho desde que você saiba o tipo (por exemplo Pilot) em tempo de compilação. Se você não sabe o tipo em tempo de compilação, você pode sim usar uma consulta DB4O SODA:

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

editar Por que usar LINQ em vez de refrigerante, o Query-by-Example (QBE), ou Native consulta (NQ)? Porque LINQ torna muito natural para fazer consulta expressões. Por exemplo, aqui está como você pode consultar para pilotos nomeados Michael:

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

E LINQ é combináveis, o que significa que você pode fazer coisas como esta:

var first20MichaelPilots = michaelPilots.Take(20);

E você ainda vai receber uma consulta eficiente executado em DB4O quando você iterar sobre os resultados. Fazer o mesmo no refrigerante ou QBE ou NQ é feio na melhor das hipóteses.

Eu acho que isso é o que você quer:

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

Você pode fazê-lo manualmente usando Type:

public static void PrintAllPilots(Type type, string pathToDb)

Ou você poderia usar genéricos para inferir o tipo:

public static void PrintAllPilots<T>(string pathToDb)
{
   //...
   var result = db.QueryByExample(typeof(T));
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top