문제

나는있다 Email 객체와 그에있는 첨부 파일 수를 검증하려고 시도합니다. List<Attachment> 재산.

속임수는 우리가 소비한다는 것입니다 Send() WCF 서비스의 방법. IT 서버 측면을 쉽게 검증 할 수 있지만 먼저 클라이언트 측을 확인하고 싶습니다.

서비스를 소비하기 위해 다른 사람들이 사용해야하는 라이브러리를 생성했으며, 이는 모든 객체와 사용 가능한 방법을 포함하는 프록시가 있습니다. 나는 과부하 할 수 있어야한다고 생각합니다 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