2011-08-26 6 views
3

가능한 중복 : 지금까지 난 그냥 수 있어요 말할 용이메이크업 목록 항목 읽기 전용

public SomeClass{ 

     public List<Status> log { get; private set; } 

     public enum Status 
     { 
      waitingForConnection, 
      connected, 
      receivingFile, 
      doneReceivingFile 
     } 

     // later I initialize log and populate it... 
     /// 

} 

을 :
List<T> readonly with a private set

으로 나는 클래스가 클래스를 사용하여 새 로그 목록을 설정합니다. 사용자가 목록에서 항목을 편집하지 못하게하려면 어떻게해야합니까? 즉 나는 사용자가 같은 것을 할 수 없도록하려면 : 나는 목록이 개인 로그인 할 경우

SomeClass someClass = new SomeClass(); 
//.... 
someClass.log[3] = \\different value 

그때 내가 이것을 달성을하지만 로그 목록의 내용을 참조 할 수 있도록 할 항목을 수정할 수는 없습니다.

또한

나는 사용자가 상태를 볼 수 있도록 공공 열거 상태가 비공개 싶지 않아 ...

그래서 내가 어떻게 목록에서 항목을 편집에서 사용자를 제한 할 수 있습니다?

+1

체크 아웃 : http://stackoverflow.com/questions/4749021/listt-readonly-with-a-private-set –

답변

4

사용 ReadOnlyCollection. 또한 다른 메모에서 readonly 키워드는 컬렉션을 읽기 전용으로 만들지 않는다는 것을 기억하십시오. 이 글의 대답

private List<Status> m_Log = new List<Status>(); 

public ReadOnlyCollection<Status> Log { 
    get { 
     return m_Log.AsReadOnly(); 
    } 
} 
+0

나는 이것을 좋아할 것이지만 그것은 NET4.5 +이다. –

+0

'ReadOnlyCollection '은 2.0 이후로 출시되었습니다. –

+0

죄송합니다. ( –

3

재산을 만들지 마십시오. List<Status>. setter가없는 인덱서 속성을 구현하기 만하면됩니다.

class Log { 
    private readonly List<Status> statuses; 
    public Log(List<Status> items) 
    { 
    statuses = items; 
    } 
    public Status this[int i] 
    { 
     get { return statuses[i]; } 
    } 
} 

public SomeClass 
{ 
    public Log log { get; private set; } 
} 
+0

이 같은 일을에서 소비자를 방지하지 않습니다' instance.Log [0] .SomeProperty = 10', 맞습니까? – nphx

1

로그 목록을 비공개로 설정하고 공용 get() 속성을 갖는 방법은 어떻습니까?

0

SomeClass을 상속받은 옵션은 IEnumerable<T>입니다.

이렇게하면 계약을 이행하고 GetEnumerator 메서드를 구현해야합니다. 단순히 목록의 열거자를 반환하십시오. 이제 이것을 읽기 전용 IEnumerable 컬렉션으로 사용할 수 있습니다.

편집
내가 다시보고, 당신은 속성 게터를 추가 할 필요가 실현이에 대한

IEnumerable<Status> StatusList 
{ 
    foreach (Status item in log) 
    { 
     yield return item; 
    } 
}