편의성 또는 "게으른 프로그래밍"ILIST 관리 - ILIST.ADD 방법 보호

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

  •  23-08-2019
  •  | 
  •  

문제

항목 목록이있는 객체가있을 때이 간단한 시나리오를 어떻게 관리합니까? 예 :

public class ContainerObject
{
    IList<ChildObject> Children { get; }

    public void AddCustom(ChildObject toAdd)
    {
        // Some validation ...
        Children.Add(toAdd);
    }
}

컬렉션이 Ilist의 구현으로 초기화되었다고 가정하면 목록에 항목이 추가되는 방식을 제어 할 수있는 방법이 있습니까?

예를 들어, 컨테이너 로버트 클래스에 childobject를 가져 와서 목록에 추가하는 다른 메소드가 있습니다. 이 방법은 추가하기 전에 ChildoBject에서 일부 기본 검증을 수행해야합니다.

나는 소비하는 개발자가 구현 해야하는 사용자 정의 목록 인터페이스 (추가 방법없이)를 쓰고 싶지 않다는 점에서 게으르다. 또한 iqueryable 인터페이스에서 Tolist () 메소드를 사용하고 있으므로 이것이 Ilist를 고수하는 또 다른 이유입니다.

그렇다면 ILIST 인스턴스에 항목이 추가되는 방법, 즉 추가 방법의 사용을 방지하고 내 사용자 지정 메소드를 통해 컬렉션에 추가 할 수있는 방법이 있습니까? ... 그리고 게으른다 :(

내 사용자 정의 방법이나 목록에 직접 항목이 추가 될 때 확인하는 몇 가지 해킹 방법을 생각할 수 있지만 해킹 된 것 같습니다!

누구든지 이와 비슷한 것을 경험합니까? 그렇다면 무엇을 했습니까?

도움이 되었습니까?

해결책

반환 a readonlycollection 세계에 추가를 관리하는 목록을 포장합니다.

다른 팁

당신은 당신의 속성을 사용하여 원래 목록 주위에 래퍼를 반환 할 수 있습니다. ReadOnlyCollection<T>. 이렇게하면 발신자가 자체적으로 항목을 추가하지 않도록합니다. 원래 변동성 목록에 대한 참조를 유지할 수 있습니다. 읽기 전용 컬렉션은 래퍼 일 뿐이므로 읽기 전용 컬렉션을 캐시하는 발신자는 여전히 원래 목록에 추가 된 추가 사항을 볼 수 있습니다. 예상 용도에 따라 좋은 일이 될 수도 있고 아닐 수도 있습니다.

편집 : 캐싱 코멘트를 설명하려면 ...

고객이 다음과 같이 가정 해 봅시다.

IList<ChildObject> originalChildren = container.Children;    
container.AddChild(new ChildObject());
IList<ChildObject> updatedChildren = container.Children;    

이랑 Children 다음과 같이 구현 된 속성 :

private IList<ChildObject> children = new List<ChildObject>();
public IList<ChildObject> Children
{
    get { return new ReadOnlyCollection<ChildObject>(children); }
}

그 다음에 originalChildren 그리고 updateChildren 둘 다 같은 내용을 가질 것입니다 - 반환 된 것 ReadOnlyCollection 아닐 것입니다 스냅 사진 첫 번째 줄에서 어린이 모음. 그것은 단지 A 일 것입니다 싸개 컬렉션 주위. 고객은 변하지 않는 것에 의존 할 수 없을 것입니다. 스스로 변경할 수는 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top