الراحة أو "البرمجة الكسولة" الإدارة Ilist - طريقة حماية iilist.add

StackOverflow https://stackoverflow.com/questions/554159

  •  23-08-2019
  •  | 
  •  

سؤال

كيف يمكنك إدارة هذا السيناريو البسيط عندما يكون لديك كائن مع قائمة العناصر. على سبيل المثال:

public class ContainerObject
{
    IList<ChildObject> Children { get; }

    public void AddCustom(ChildObject toAdd)
    {
        // Some validation ...
        Children.Add(toAdd);
    }
}

عند إهتمام المجموعة بتطبيق إيليست، هل هناك أي طريقة للتحكم في الطريقة التي تتم إضافة العناصر فيها إلى القائمة؟

على سبيل المثال، لدي طريقة أخرى على فئة الحاويات التي تأخذ irlobject وتضيفها إلى القائمة. هذه الطريقة مطلوبة لأداء بعض التحقق الأساسي على childobject قبل إضافة ذلك.

أنا كسول في أنني لا أريد الفوضى وكتابة واجهة قائمة مخصصة (بدون طريقة إضافة) التي يحتاجها المطورين المستهلكة إلى تنفيذها. أنا أيضا استخدام طريقة Tolist () على واجهة Iqueryable، لذلك هذا سبب آخر للالتصاق مع Ilist - إنه يعمل فقط.

لذلك، هل هناك نهج يمكنك شريته في كيفية إضافة العناصر إلى مثيل IList، أي منع استخدام طريقة الإضافة واترك فقط إضافة إلى المجموعة عبر الطريقة المخصصة، أو أنا فقط أسأل عن المستحيل؟ ... ويجري كسول :(

أستطيع أن أفكر في عدد قليل من طرق الاختراق التي يمكن من خلالها التحقق عند إضافة العناصر عبر الطريقة المخصصة أو مباشرة في القائمة ولكن هذه تبدو هاكني!

أي شخص تجربة أي شيء مماثل لهذا؟ إذا كان الأمر كذلك، ماذا فعلت؟

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

المحلول

عودة أ ReadonlyCollection. إلى العالم الذي يفرض قائمتك التي تديرها.

نصائح أخرى

يمكنك جعل الممتلكات الخاصة بك إرجاع التفاف حول القائمة الأصلية باستخدام ReadOnlyCollection<T>. وبعد سيضمن ذلك أن المتصلين لا يضيفون أي عناصر أنفسهم. يمكنك الاحتفاظ بالرجوع إلى القائمة الأصلية المتغيرة. لاحظ أنه نظرا لأن المجموعة للقراءة فقط ليست سوى مجمع، فإن المتصلين الذين سيتم اعتمادهم على مجموعة القراءة فقط ستظل يرون إضافات تقوم بها إلى القائمة الأصلية. قد يكون ذلك أو لا يكون الأمر جيدا اعتمادا على استخدامك المتوقع.

تحرير: لشرح تعليق التخزين المؤقت الخاص بي ...

لنفترض أن العميل فعل:

IList<ChildObject> originalChildren = container.Children;    
container.AddChild(new ChildObject());
IList<ChildObject> updatedChildren = container.Children;    

مع ال Children تم تنفيذ الممتلكات مثل هذا:

private IList<ChildObject> children = new List<ChildObject>();
public IList<ChildObject> Children
{
    get { return new ReadOnlyCollection<ChildObject>(children); }
}

ثم originalChildren و updateChildren سيكون كلاهما نفس المحتويات - عاد ReadOnlyCollection لن يكون أ لمحة من جمع الأطفال في السطر الأول. سيكون فقط غلاف حول المجموعة. لن يكون العملاء قادرين على الاعتماد عليه لا يتغير - فلن يتمكنوا من تغييره لأنفسهم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top