التحميل الزائد على طريقة الإضافة الخاصة بـ LINQ للتحقق من الصحة

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

  •  22-07-2019
  •  | 
  •  

سؤال

انا لدي Email الكائن وأحاول التحقق من عدد المرفقات الموجودة فيه List<Attachment> ملكية.

الحيلة هي أننا نستهلك Send() الطريقة عبر خدمة WCF.من السهل التحقق من صحتها من جانب الخادم، ولكنني أريد التحقق من صحتها من جانب العميل أولاً.

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

public partial class List<Attachment>
{
    public void Add(Attachment item)
    {
        base.Add(item);
        if (this.Count() > maxAttachments)
        {
            throw new Exception("fail")
        }
    }
}

هذا لا يعمل - لا يمكنني فئة base.Add() ولا يمكنني تحديد فئة جزئية بنوع محدد.

كيف أقوم بإنشاء حمل زائد لطريقة الإضافة حتى أتمكن من تضمين بعض التعليمات البرمجية المخصصة؟

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

المحلول

إذا كنت تملك Email فئة، سيكون الخيار الأفضل لديك هو تغيير النوع الأساسي لعضو القائمة إلى تطبيق متخصص للقائمة.

public class Email
{
    const int MaxAttachments = /* ... */;

    public Email(/* ... */)
    {
        this.Attachments = new FixedSizeList<Attachment>(MaxAttachments);
    }

    // ...

    public IList<Attachment> Attachments
    {
        get;
        private set;
    }
}

class FixedSizeList<T> : IList<T>
{
    List<T> innerList;
    int maxCount;

    public FixedSizeList(int maxCount)
    {
        this.innerList = new List<T>(maxCount);
        this.maxCount = maxCount;
    }

    // override all the IList<T> members here by delegating
    // to your innerList ...
    // ...

    public void Add(T item)
    {
         if (this.Count == this.maxSize)
         {
             throw new InvalidOperationException("No more items can be added.");
         }

         this.innerList.Add(item);
    }

    // ...
    // ...
}

إنه نوع من التعليمات البرمجية المعيارية، ولكن هذه هي الطريقة الوحيدة لتجاوز السلوك بشكل واضح.

ومع ذلك، إذا كنت لا تملك Email أيها الطلاب، لا يمكنكم فعل ذلك من خلال الوسائل التقليدية؛ستحتاج إلى اختراق انعكاسي لاستبدال العضو الأساسي أو شيء من هذا القبيل إطار التوسعة المدارة.

نصائح أخرى

وList<T> ليس فئة جزئية، لذلك لا يمكن أن تمتد باستخدام فئات جزئية الخاصة بك.

وأيضا، LINQ إلى كائنات لا توفر Add() على List<T>، وهذا جزء من واجهة IList<T> تنفذها List<T>، وAdd() ليس أسلوب ظاهري أو مجردة في List<T>، لذلك لا يمكن تجاوزه.

وماذا يجب أن ننظر هو System.Collections.ObjectModel.Collection<T> - يوفر هذا المكون على تنفيذ لائحة مماثلة لList<T> لديها القدرة وأضاف لتجاوز أساليب الحماية التي تعطي لك مكانا للقيام بمهام التحقق

وليس لديك لتنفيذ قائمة من الصفر، أنت فقط ترث منه، وتجاوز أساليب مثل InsertItem() وRemoveItem() لتنفيذ قواعد العرف:


using System.Collections.ObjectModel;

public class EmailCollection : Collection<Email>
{
    public int MaximumAttachments { get; set; }

    protected override void InsertItem(int index, Email item)
    {
        if (Count == MaximumAttachments)
        {
            ... throw error
        }

        // do actual insert
        base.InsertItem(index, item)
    }
}

وAdd() يدعو InsertItem() تحت غطاء محرك السيارة.

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