2011-02-10 10 views

Trả lời

6

Tôi thích sử dụng PropertyInfo.GetIndexParameters:

var indexers = targetType.GetProperties(bindingFlags) 
         .Where(p => p.GetIndexParameters().Any()); 
         .Select(p => p.GetGetMethod()); 

Bây giờ indexers là một IEnumerable<MethodInfo> của getters của indexers phù hợp với quy định được đưa ra trong BindingFlagsbindingFlags.

Lưu ý cách mã đọc giống như trong số targetType, nhận các thuộc tính khớp với số bindingFlags, lấy các thuộc tính là trình lập chỉ mục và sau đó lên dự án. Nó ít bí ẩn hơn nhiều so với sử dụng chuỗi ma thuật "get_Item" và nhiều người lập chỉ mục được xử lý dễ dàng.

Nếu bạn biết chỉ có một, bạn có thể sử dụng khóa học Single. Nếu bạn đang tìm kiếm một trong nhiều cụ thể, bạn có thể kiểm tra kết quả của GetIndexParameters cho phù hợp.

+0

Tôi muốn MethodInfo chứ không phải PropertyInfo. – smartcaveman

+0

@smartcaveman: Wow. 'Sử dụng PropertyInfo.GetGetMethod' trên những gì tôi đã cho bạn ở trên. – jason

2

Cách thích hợp là truy xuất DefaultItemAttribute cho lớp. Nó có tên của thuộc tính indexer. Nó không phải là "Item", các ngôn ngữ như VB.NET cho phép xác định bất kỳ thuộc tính nào là chỉ mục. Mã của Jason cũng sẽ thất bại trên chúng, có thể có nhiều hơn một thuộc tính được lập chỉ mục. Nhưng chỉ có một mặc định.

+0

Bạn có tài liệu nào về điều này không? Tôi không thể tìm thấy nó ở bất cứ đâu. – smartcaveman

+0

MSDN, nhìn vào từ khóa mặc định VB.NET và lớp DefaultMemberAttribute. –