Frage

Ich habe ein Email Objekt und bin versucht, die Anzahl der Anlagen zu überprüfen, die in seiner List<Attachment> Eigenschaft sind.

Der Trick besteht darin, dass wir die Send() Methode über einen WCF-Dienst verbrauchen. Es ist einfach, es Server-Seite zu überprüfen, aber ich mag es Client-Seite überprüfen zuerst.

Ich habe eine Bibliothek erzeugt, die andere angeblich verwenden, um den Dienst zu verbrauchen, was wiederum einen Proxy alle Objekte und verfügbaren Methoden enthalten hat. Ich glaube, ich soll in der Lage, die Add() Methode auf dem GenericList mit einigen benutzerdefinierten Code zu überlasten, so dass die Sammlung überprüft, wenn etwas hinzugefügt wird, und wenn es das angegebene Maximum überschreitet dann eine Ausnahme ausgelöst wird.

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

Das funktioniert nicht - ich kann nicht Klasse base.Add () und ich kann nicht Teil-Klasse mit einem angegebenen Typ definieren

.

Wie kann ich eine Überlastung für die Add-Methode erstellen, so dass ich einige benutzerdefinierte Code enthalten?

War es hilfreich?

Lösung

Wenn Sie die Email Klasse besitzen, ist Ihre beste Option wäre, den zugrunde liegenden Typ des Listenelement in eine spezialisierte Implementierung einer Liste zu ändern.

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

    // ...
    // ...
}

Es ist irgendwie viel Standardcode, aber das ist wirklich der einzige Weg, um sauber das Verhalten außer Kraft setzen.

Wenn Sie jedoch nicht besitzen die Email Klasse, kann man nicht wirklich tun dies durch traditionelle Mittel; Sie würden eine Reflexion Hack müssen die zugrunde liegende Element oder so etwas wie das Managed Extensibility Framework zu ersetzen.

Andere Tipps

List<T> ist kein Teil-Klasse, so dass Sie es nicht verlängern Sie Ihre eigenen Teilklassen verwenden.

Auch LINQ to Objects nicht Add() auf List<T> sorgen, dass durch IList<T> implementiert Teil der List<T> Schnittstelle ist, und Add() ist keine virtuelle oder abstrakte Methode in List<T>, so dass Sie es nicht außer Kraft setzen.

Was Sie sehen sollen System.Collections.ObjectModel.Collection<T> ist -. Diese Komponente eine Liste Implementierung ähnlich sieht mit der zusätzlichen Kapazität List<T> geschützte Methoden außer Kraft zu setzen, die Ihnen einen Platz Validierungsaufgaben zu tun

Sie müssen die Liste von Grund auf nicht implementieren, wodurch du es nur erben und überschreiben Methoden wie InsertItem() und RemoveItem() benutzerdefinierte Regeln zu implementieren:


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() ruft InsertItem() unter der Haube.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top