سؤال

وأنا أحاول لبناء كائن ويبدو أن شيئا من هذا القبيل:

  public class MyObject
  {
    private IList<AnotherObject> items;
    public List<AnotherObject> Items
    {
      return items.AsEnumerable().ToList<AnotherObject>();
    }
  }

وأنا باستخدام NHibernate كما بلدي DAL ويكون ذلك رسم الخرائط مباشرة إلى الميدان العناصر وكل ما يعمل بشكل جيد.

وأنا أيضا باستخدام ويندوز سير العمل والنشاط النسخ المتماثل لا تعمل مع IList عام. ( HTTP: // الاجتماعية .msdn.microsoft.com / منتديات / EN-US / windowsworkflowfoundation / موضوع / 2ca74b60-fd33-4031-be4b-17a79e9afe63 ) وهذا يجبر لي في شكل أساسي على استخدام المجمع قائمة <> بدلا من IList <>. هذا بالطبع يكسر رسم الخرائط NHibernate المباشر لا يمكن أن يلقي تنفيذ IList NHibernate مباشرة إلى قائمة.

و** تحرير: متطلبات Windows سير العمل، يعني في الواقع أنا ذاهب لتفقد الوصول من نوع آمن إلى قائمة مهما لأنه يتطلب IList

.

والآن الهدف هو تسلسل / إلغاء تسلسل هذا الكائن. هذا يعمل بشكل جيد مع التسلسل ثنائي ولكن الكامنة وراء الكائنات الوكيل NHibernate تنفجر مع أخطاء nhibernate عندما أحاول إلغاء تسلسل لهم.

وهكذا حاولت أكس التسلسل. التسلسل يعمل بشكل جيد ويعطي لي لطيفة تعريفات فئة محددة في ملف xml تسلسل الذي يستبعد الوكلاء nhibernate تماما. ومع ذلك، عند محاولة إلغاء تسلسل هذه، وأنا غير قادر على إضافة عناصر إلى قائمة باسم الدعوة items.AsEnumerable.ToList لن تسمح الحصول على إضافة عناصر إلى القائمة الأساسية عبر طريقة. إضافة.

هل لديها أية أفكار حول هذا؟ أنا ذاهب عن هذا بطريقة خاطئة؟

و** تحرير: فئة محددة NHibernate هي NHibernate.Collection.Generic.PersistentGenericBag الذي يحدث بالفعل تنفيذ IList مباشرة. ومع ذلك، لقد فقدت كل الفوائد من نوع الآمن للقائمة العامة. وهذا يضع لي مرة أخرى في مجال الحاجة إلى كتابة مجمع لكل كائن الأطفال وأردت حقا أن تجنب ذلك إذا أمكن ذلك.

هل كانت مفيدة؟

المحلول

في الخيار هو خلق تنفيذ CustomList الخاصة بك وهذا هو التفاف حول مثيل التي تطبق IList

وأي بمعنى:

public CustomList<AnotherObject> Items    
{      
    return new CustomList<AnotherObject>(items); 
}

وأي بمعنى. عند إضافة إلى CustomList<T> الخاص بك فإنه يضيف إلى قائمة الدعم.

وهذا يبدو وكأنه طالما صفك تنفذ IList وكذلك IList<T> سوف يكون على ما يرام.

نصائح أخرى

نعم، للأسف لا يمكنك الذهاب عن ذلك بهذه الطريقة. داعيا ToList() بإنشاء مثيل جديد من القائمة، وذلك عند إضافة عناصر إلى ذلك المثيل أنهم لن تنعكس في القائمة الأصلية (كما كنت قد اكتشفت بوضوح).

وأنا لا تستخدم NHibernate، ولكن أود أن تكون غريبة لمعرفة ما اذا الحاويات تنفذ IList (النسخة غير عامة). من الخيط الذي أشرت إليه، يبدو أن System.Collections.IList ما هو مطلوب في الواقع (وهذا ما تنفذه List<T>، الذي هو السبب في أنه يعمل). هل تنفذ الحاويات IList؟

ولا يمكنك فقط يلقي مثل هذا؟

public class MyObject
{
    private IList<AnotherObject> items;
    public List<AnotherObject> Items()
    {
        return (List<AnotherObject>)items;
    }
}

ولم تتح فرصة لمحاولة الخروج منها، ولكن أعتقد أنه يجب أن تعمل!

وأعتقد أن (غير عام) جمع NHibernate PersistentBag تنفذ IList لذلك يمكن أن اكتب البنود كما IList بدلا من IList<AnotherObject>. الارتباط في سؤالك ينص على أن المشكلة هي أن النسخ المتماثل يتطلب IList التي List<T> الأدوات ولكن IList<T> لا (الذهاب الشكل).

هل يمكن تحويل إلى IEnumerable ؟ هل يمكن أن حاول هذا:

public class MyObject
{
    private IList<AnotherObject> items;
    public List<AnotherObject> Items
    {
        return new List<AnotherObject>items.Cast<AnotherObject>());
    }
    // or, to prevent modifying the list
    public IEnumerable<AnotherObject> Items
    {
        return items.Cast<AnotherObject>();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top