Вопрос

Как передать тип класса в функцию в C #?

Когда я попал в db4o и C #, после прочтения руководств я написал следующую функцию:

    public static void PrintAllPilots("CLASS HERE", string pathToDb)
    {
        IObjectContainer db = Db4oFactory.OpenFile(pathToDb);
        IObjectSet result = db.QueryByExample(typeof("CLASS HERE"));
        db.Close();
        ListResult(result);
    }
Это было полезно?

Решение

Есть два пути. Первый - явно использовать тип Type.

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

PrintAllPilots(typeof(SomeType),somePath);

Второе - использовать дженерики

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

PrintAllPilots<SomeType>(somePath);

Другие советы

В ответах Джона, Джареда и Ишудителу используется запрос за примером, который в основном не использует механизм запросов DB4o и в будущем может быть устаревшим.

Предпочтительными методами запросов к DB4O для .NET являются собственные запросы и LINQ.

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

Или, в качестве альтернативы, используя Linq-to-DB4O:

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

Обе эти работы при условии, что вы знаете тип (например, Pilot) во время компиляции. Если вы не знаете тип во время компиляции, вы можете вместо этого использовать запрос DB4O SODA:

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

edit Зачем использовать LINQ вместо SODA, Query-by-Example (QBE) или Native Query (NQ)? Потому что LINQ делает очень естественным делать выражения запросов. Например, вот как бы вы запросили пилотов по имени Майкл:

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

И LINQ является составным, что означает, что вы можете делать такие вещи:

var first20MichaelPilots = michaelPilots.Take(20);

И вы по-прежнему получите эффективный запрос, выполняемый в DB4O, когда будете повторять результаты. Делать то же самое в SODA, QBE или NQ в лучшем случае некрасиво.

Я думаю, это то, что вы хотите:

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

Вы можете сделать это вручную, используя Type :

public static void PrintAllPilots(Type type, string pathToDb)

Или вы можете использовать обобщения для вывода типа:

public static void PrintAllPilots<T>(string pathToDb)
{
   //...
   var result = db.QueryByExample(typeof(T));
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top