質問

クラス型を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);
    }
役に立ちましたか?

解決

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

他のヒント

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;

これらの作業は両方とも、コンパイル時にタイプ(パイロットなど)を知っていれば提供されます。コンパイル時にタイプがわからない場合は、代わりに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で同じことを行うのはせいぜいatいです。

これはあなたが望むものだと思います:

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