Pregunta

Tengo una Email objeto y estoy tratando de validar el número de archivos adjuntos que se encuentran en su List<Attachment> de la propiedad.

El truco está en que consumimos la Send() método a través de un servicio WCF.Es fácil de validar el lado del servidor, pero quiero validar lado del cliente en primer lugar.

He generado una biblioteca que otros se supone se debe utilizar en orden a consumir el servicio, que a su vez tiene un proxy que contiene todos los objetos y los métodos disponibles.Creo que yo debería ser capaz de sobrecarga de la Add() método en el GenericList con algo de código personalizado para la colección está marcada cuando nada se agrega, y si supera el máximo especificado, a continuación, se produce una excepción.

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

Esto no funciona no puedo clase base.Add() y no puedo definir parcial de la clase con un tipo especificado.

¿Cómo puedo crear una sobrecarga para el método Add para que yo pueda incluir algún código personalizado?

¿Fue útil?

Solución

Si posee la clase Email, su mejor opción sería cambiar el tipo subyacente del miembro Lista a una implementación especializada de una lista.

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 una especie de código repetitivo, pero esa es realmente la única forma de anular claramente el comportamiento.

Sin embargo, si no posee la clase <=>, realmente no puede hacerlo a través de los medios tradicionales; necesitaría un truco de reflexión para reemplazar el miembro subyacente o algo así como el Marco de extensibilidad administrado .

Otros consejos

List<T> no es una clase parcial, por lo que no se puede ampliar mediante sus propias clases parciales.

También, LINQ to Objects no proporcionar Add() en List<T>, que es parte de la IList<T> interfaz implementada por la List<T>, y Add() no es un virtual o método abstracto en List<T>, por lo que no se puede reemplazar.

Lo que usted debe buscar en es System.Collections.ObjectModel.Collection<T> - este componente proporciona una lista de implementación similar a la List<T> con el añadido de la capacidad para reemplazar protegido métodos que le dan un lugar para hacer las tareas de validación.

Usted no tiene que implementar la lista desde cero, que acaba de heredar de ella, y reemplazar los métodos, tales como InsertItem() y RemoveItem() para implementar reglas personalizadas:


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() llamadas InsertItem() bajo el capó.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top