4

如何将类类型传递给 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);
    }
4

4 回答 4

11

有两种方法。第一种是显式使用 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);
于 2009-06-22T13:47:47.587 回答
5

Jon、Jared 和 yshuditelu 给出的答案使用示例查询,这在很大程度上是未使用的 DB4o 查询机制,将来可能会被弃用。

在 DB4O for .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();

编辑为什么使用 LINQ 而非 SODA、Query-by-Example (QBE) 或 Native Query (NQ)?因为 LINQ 让查询表达式变得非常自然。例如,以下是您查询名为 Michael 的飞行员的方式:

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

LINQ 是可组合的,这意味着您可以执行以下操作:

var first20MichaelPilots = michaelPilots.Take(20);

当您对结果进行迭代时,您仍然可以在 DB4O 中获得高效的查询。在 SODA 或 QBE 或 NQ 中做同样的事情充其量是丑陋的。

于 2009-06-22T14:00:00.963 回答
1

我认为这就是你想要的:

public static void PrintAllPilots(Type classType, string pathToDb)
{
    IObjectContainer db = Db4oFactory.OpenFile(pathToDb);
    IObjectSet result = db.QueryByExample(classType);
    db.Close();
    ListResult(result);
}
于 2009-06-22T13:47:28.227 回答
0

您可以使用以下方法手动执行此操作Type

public static void PrintAllPilots(Type type, string pathToDb)

或者您可以使用泛型来推断类型:

public static void PrintAllPilots<T>(string pathToDb)
{
   //...
   var result = db.QueryByExample(typeof(T));
}
于 2009-06-22T13:48:17.397 回答