문제

클래스 유형을 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);
    }
도움이 되었습니까?

해결책

두 가지 방법이 있습니다. 첫 번째는 유형 유형을 명시 적으로 사용하는 것입니다.

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

다른 팁

Jon, Jared 및 Yshuditelu가 제공 한 답변은 거의 사용하지 않은 DB4O 쿼리 메커니즘 인 쿼리별로 사용되며 잠재적으로 미래에도 더 이상 사용되지 않을 수 있습니다.

.NET 용 DB4O에서 선호되는 쿼리 방법은 기본 쿼리 및 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 소다 쿼리를 사용할 수 있습니다.

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

편집하다 소다 대신 LINQ, query-by-example (QBE) 또는 기본 쿼리 (NQ)를 사용하는 이유는 무엇입니까? LINQ는 쿼리 표현식을 수행하는 것이 매우 자연 스럽기 때문입니다. 예를 들어, Michael이라는 조종사를 쿼리하는 방법은 다음과 같습니다.

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

LINQ는 합성 가능하므로 다음과 같은 작업을 수행 할 수 있습니다.

var first20MichaelPilots = michaelPilots.Take(20);

결과를 반복 할 때 DB4O에서 효율적인 쿼리가 여전히 실행됩니다. 소다 나 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