2011-10-20 41 views
22

Có thể một số giải thích cho tôi tại sao phương thức GetProperties sẽ không trả về giá trị công khai nếu lớp được thiết lập như sau.Phương thức GetProperties System.Reflection không trả về giá trị

public class DocumentA 
{ 
    public string AgencyNumber = string.Empty; 
    public bool Description; 
    public bool Establishment; 
} 

Tôi cố gắng để thiết lập một phương pháp đơn vị kiểm tra đơn giản để chơi xung quanh với

Phương pháp này là như sau và nó có tất cả thích hợp sử dụng báo cáo và tài liệu tham khảo.

Tất cả tôi đang làm là gọi sau nhưng nó sẽ trả về 0

PropertyInfo[] pi = target.GetProperties(BindingFlags.Public | BindingFlags.Instance); 

Nhưng nếu tôi thiết lập các lớp với các thành viên tư nhân và tài sản công cộng nó hoạt động tốt.

Lý do tôi không thiết lập lớp học theo cách cũ của trường là vì nó có 61 thuộc tính và làm điều đó sẽ làm tăng dòng mã của tôi lên ít nhất gấp ba lần. Tôi sẽ là một cơn ác mộng bảo trì.

+2

Điều hiển nhiên là lớp học không có bất kỳ thuộc tính nào. Chỉ các trường. Cơn ác mộng bắt đầu khi bạn cho phép lớp học phát nổ như thế. Sử dụng các lĩnh vực công cộng chi phí ngủ nhiều hơn. –

Trả lời

44

Bạn chưa khai báo bất kỳ thuộc tính nào - bạn đã khai báo các trường . Đây là mã tương tự với các thuộc tính:

public class DocumentA 
{ 
    public string AgencyNumber { get; set; } 
    public bool Description { get; set; } 
    public bool Establishment { get; set; } 

    public DocumentA() 
    { 
     AgencyNumber = ""; 
    } 
} 

tôi sẽ tư vấn cho bạn mạnh mẽ sử dụng tài sản như trên (hoặc có thể với setters hạn chế hơn) thay vì chỉ cần thay đổi để sử dụng Type.GetFields. Các lĩnh vực công cộng vi phạm đóng gói. (Các thuộc tính có thể thay đổi công khai không tuyệt vời ở mặt trước đóng gói, nhưng ít nhất chúng cung cấp API, việc triển khai có thể được thay đổi sau này.)

+0

Tôi đồng ý với bạn hoàn toàn về việc sử dụng các thuộc tính thay vì các trường. Tôi chỉ không biết cú pháp chính xác. Tôi thường tuyên bố các lĩnh vực tư nhân và những người định cư và người định cư công cộng. Vấn đề của tôi là tôi nghĩ rằng tôi đã sử dụng tài sản khi trong thực tế tôi đã mất tích {get, set}. Cảm ơn bạn đã làm rõ. – gsirianni

+0

Câu trả lời này thực sự đã giúp tôi ra –

4

Vì cách bạn đã khai báo lớp của bạn hiện đang sử dụng Trường. Nếu bạn muốn truy cập vào các lĩnh vực phản chiếu máng, bạn nên sử dụng Type.GetFields() (xem Types.GetFields Phương pháp 1)

Tôi không có phiên bản nào của C# bạn đang sử dụng nhưng cú pháp thuộc tính đã thay đổi trong C# 2 như sau:

public class Foo 
{ 
    public string MyField; 
    public string MyProperty {get;set;} 
} 

Việc này có giúp giảm số lượng mã không?

+0

Cảm ơn câu trả lời của bạn. Tôi chỉ có cú pháp của tôi tranh giành. Tôi thường không khai báo tài sản theo cách này.Hầu hết các tiem tôi có tài sản công cộng với các lĩnh vực tư nhân tương ứng. – gsirianni

+2

Nhưng tại sao? Sử dụng cú pháp ngắn tay biên dịch thành cùng một IL. Trình biên dịch tạo ra trường phụ trợ cho bạn. Bạn chỉ cần cú pháp phức tạp hơn khi bạn muốn thực hiện một số xử lý khác trong getter hoặc setter. –

0

Như đã đề cập, đây là các trường không thuộc tính. Cú pháp thuộc tính sẽ là:

public class DocumentA { 
    public string AgencyNumber { get; set; } 
    public bool Description { get; set; } 
    public bool Establishment { get; set;} 
} 
1

Tôi thấy chủ đề này đã được bốn tuổi, nhưng không ít tôi không hài lòng với câu trả lời được cung cấp. OP nên lưu ý rằng OP đang đề cập đến các trường không thuộc tính. Để tự động đặt lại tất cả các trường (bằng chứng mở rộng) hãy thử:

/** 
* method to iterate through Vehicle class fields (dynamic..) 
* resets each field to null 
**/ 
public void reset(){ 
    try{ 
     Type myType = this.GetType(); //get the type handle of a specified class 
     FieldInfo[] myfield = myType.GetFields(); //get the fields of the specified class 
     for (int pointer = 0; pointer < myfield.Length ; pointer++){ 
      myfield[pointer].SetValue(this, null); //takes field from this instance and fills it with null 
     } 
    } 
    catch(Exception e){ 
     Debug.Log (e.Message); //prints error message to terminal 
    } 
} 

Lưu ý rằng GetFields() chỉ có quyền truy cập vào các trường công cộng vì lý do hiển nhiên.

+0

Câu trả lời này giải quyết câu hỏi ban đầu trên các trường, ngay cả khi tác giả đã sử dụng sai GetProperties() trên các trường. Cảm ơn bạn! –

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