2012-02-20 40 views
21

Tôi đang cố gắng để phản ánh trên một số thuộc tính của lớp và đặt chúng programaticlly, nhưng có vẻ như một bộ lọc PropertyInfo của tôi không hoạt động:"phương pháp thiết lập tài sản không tìm thấy" lỗi trong quá trình phản ánh

//Get all public or private non-static properties declared in this class (no inherited properties) - that have a getter and setter. 
PropertyInfo[] props = this.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.SetProperty); 

tôi 'm nhận được một lỗi trên dòng

pi.SetValue(this, valueFromData, null); 

Bởi vì tài sản chỉ có một phương pháp get{}, không có phương pháp set{}.

Câu hỏi của tôi là tại sao thuộc tính này không được lọc ra khỏi đạo cụ? Tôi nghĩ đó là mục đích của BindingFlags.SetProperty.

Khách sạn không nhận được lọc ra là:

public String CollTypeDescription 
    { 
     get { return _CollTypeDescription; } 
    } 

Lưu ý rằng tôi muốn lọc thuộc tính sẽ không hoạt động trước thời hạn, vì tôi liệt kê tất cả cùng một lúc. Tôi làm không muốn sử dụng pi.GetSetMethod() sau khi thực tế xác định xem tôi có thể sử dụng trình thiết lập hay không.

+2

@dtryon - không - anh OR-ing cùng những lá cờ cho các tùy chọn anh muốn đặt . –

Trả lời

51

Từ các tài liệu:

BindingFlags.SetProperty

Chỉ định rằng giá trị của tài sản theo quy định nên được thiết lập. Đối với các thuộc tính COMCOM, chỉ định cờ ràng buộc này tương đương với chỉ định PutDispProperty và PutRefDispProperty.

BindingFlags.SetPropertyBindingFlags.GetPropertykhông tính lọc đang thiếu setters hoặc thu khí, tương ứng.

Để kiểm tra xem thuộc tính có thể được đặt hay không, hãy sử dụng thuộc tính CanWrite.

if (pi.CanWrite) 
    pi.SetValue(this, valueFromData, null); 
+0

Cảm ơn thông tin - không thể sử dụng CanWrite bởi vì điều này chỉ tiết lộ những người định cư công cộng và tôi vẫn có thể sử dụng những người định cư riêng vì tôi đang làm điều này từ bên trong lớp học. – Alain

+0

@Alain - Bạn có chắc chắn không? Tôi vừa làm một thử nghiệm với một tài sản riêng với một getter và setter. Thuộc tính CanWrite trả về true cho thuộc tính private đó. – ken

+0

Hiểu sai về phía tôi. Bạn đúng - cả hai có thể hoán đổi cho nhau và vì phương pháp của bạn không yêu cầu thử nghiệm null, nên bạn nên sử dụng nó. – Alain

-1

Tôi hiểu GetProperties() phương pháp để nó trả về tất cả các tài sản đó có BindingFlags.GetPropertyhayBindingFlags.SetProperty.
Vì vậy, nếu bạn chỉ muốn các thuộc tính có trình cài đặt, bạn phải xóa cờ BindingFlags.GetProperty. Nhưng tôi đã không thử nghiệm nó vì vậy tôi có thể sai.

Câu trả lời của tôi có -1. Vì vậy, có vẻ như câu trả lời của tôi là sai.

2

Nhờ ken cho thông tin. Có vẻ như là giải pháp tốt nhất mà tôi có thể lấy nó để lọc chúng ra bằng cách kiểm tra GetSetMethod (true) trong một bộ lọc LINQ:

//Get all public or private non-static properties declared in this class (no inherited properties) - that have a getter and setter. 
PropertyInfo[] props = this.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Where(p => p.GetGetMethod(true) != null && p.GetSetMethod(true) != null).ToArray(); 
+0

Xem nhận xét của tôi về câu trả lời của tôi. CanWrite đang trả về 'true' cho tôi đối với các thuộc tính riêng tư. Nó không hoạt động theo cùng một cách cho bạn? – ken

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