유효성 검사를위한 LINQ의 ADD 메소드 오버로드
-
22-07-2019 - |
문제
나는있다 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()
후드.