سؤال

وكيف يمكنك تمرير نوع الصف إلى وظيفة في 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);

نصائح أخرى

والإجابات التي قدمها من قبل جون، جاريد، واستخدام yshuditelu الاستعلام تلو المثال وهو غير المستخدمة إلى حد كبير آلية الاستعلام عن DB4o، ويحتمل أن تكون مهملة في المستقبل.

والأساليب المفضلة لدى الاستعلام على DB4O ل. NET هي الاستفسارات المحلية وLINQ.

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

وأو باستخدام بدلا ينق إلى 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();

تحرير لماذا استخدام LINQ بدلا من الصودا، سؤال على حدة مثال (QBE)، أو استعلام الأصلية (NQ)؟ لأن LINQ يجعل من الطبيعي جدا أن تفعل تعبيرات الاستعلام. على سبيل المثال، وهنا كيف كنت الاستعلام عن الطيارين يدعى مايكل:

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

وLINQ هو composable، وهذا يعني أنك يمكن أن تفعل أشياء من هذا القبيل:

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