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

2 つの方法があります。1 つ目は、Type 型を明示的に使用することです。

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

PrintAllPilots(typeof(SomeType),somePath);

2つ目は、ジェネリックを使用することです

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 のクエリ メカニズムとしてほとんど使用されていない query-by-example が使用されており、将来的には非推奨になる可能性があります。

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();

edit SODA、Query-by-Example (QBE)、Native Query (NQ) の代わりに LINQ を使用する理由 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 に答える