2010-05-18 14 views
8

Tôi đang tạo một lớp chứa một từ điển làm thành viên riêng tư. Tôi muốn phơi bày các giá trị của từ điển mà không để lộ từ điển (trong thời trang chỉ đọc). Tôi có thể dễ dàng tạo ra một thuộc tính để lộ _dictionary.Keys, nhưng làm thế nào tôi có thể quá tải [] sao cho MyClass[key] trả về _dictionary[key]?Tôi có thể quá tải các toán tử [] như thế nào?

Tôi nghĩ rằng tôi có thể cần phải thực hiện một giao diện, nhưng tôi không chắc chắn cái nào ...

Trả lời

23

Tôi khá chắc chắn đây là những gì bạn đang sau:

public TValue this[TKey key] { 
    get { return _dictionary[key]; } 
} 

Nếu bạn muốn triển khai giao diện để chỉ ra mã máy khách mà lớp của bạn có thể được truy cập bằng chỉ mục loại TKey, kết quả phù hợp nhất (mà tôi biết) là IDictionary<TKey, TValue>.

Thật không may, IDictionary<TKey, TValue> có toàn bộ thành viên vi phạm yêu cầu chỉ đọc của bạn, có nghĩa là bạn sẽ phải thực hiện rõ ràng nhiều thành viên chỉ để ném NotImplementedException (hoặc somesuch) khi chúng được gọi là: setter cho this, Add, ClearRemove.

Có thể có một giao diện khác phù hợp hơn cho mục đích này (ví dụ như IReadOnlyDictionary<TKey, TValue>?); Tôi đã không đi qua nó.

Bạn cũng có thể viết riêng giao diện của mình, tất nhiên, nếu bạn định có nhiều lớp cung cấp chức năng tương tự như vậy.

+0

Cảm ơn! Thật khó để tìm kiếm '[]'. Tôi không cần phải đi xa như vậy để viết giao diện của riêng tôi, nhưng cảm ơn cho tip đó, quá. Chỉ cái mã bạn đưa ra là mọi thứ tôi cần bây giờ. – dlras2

Các vấn đề liên quan