2008-12-11 38 views
14

Tôi đang cố gắng sử dụng sự phản chiếu để có được một tài sản từ một lớp học. Dưới đây là một số mẫu mã của những gì tôi đang nhìn thấy:Tại sao GetProperty không tìm thấy?


using System.Reflection; 
namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      PropertyInfo[] tmp2 = typeof(TestClass).GetProperties(); 
      PropertyInfo test = typeof(TestClass).GetProperty(
       "TestProp", BindingFlags.Public | BindingFlags.NonPublic); 
     } 
    } 

    public class TestClass 
    { 
     public Int32 TestProp 
     { 
      get; 
      set; 
     } 
    } 
} 

Khi tôi theo dõi qua chuyện này, đây là những gì tôi thấy:

  • Khi tôi lấy tất cả các đặc tính sử dụng GetProperties(), mảng kết quả có một mục nhập, cho thuộc tính TestProp.
  • Khi tôi cố gắng tìm nạp TestProp bằng cách sử dụng GetProperty(), tôi lấy lại giá trị rỗng.

Tôi hơi bối rối; Tôi đã không thể tìm thấy bất cứ điều gì trong MSDN liên quan đến GetProperty() để giải thích kết quả này cho tôi. Bất kỳ giúp đỡ?

EDIT:

Nếu tôi thêm BindingFlags.Instance đến GetProperties() cuộc gọi, không có tài sản được tìm thấy, thời kỳ. Điều này là phù hợp hơn, và dẫn tôi tin rằng TestProp không được coi là một tài sản dụ cho một số lý do.

Tại sao lại như vậy? Tôi cần phải làm gì với lớp học để tài sản này được coi là một tài sản cá thể?

Trả lời

12

Thêm BindingFlags.Instance vào cuộc gọi GetProperty.

EDIT: Để trả lời nhận xét ...

Mã sau trả về thuộc tính.

Lưu ý: Đó là một ý tưởng tốt để thực sự làm cho tài sản của bạn làm điều gì đó trước khi bạn cố gắng lấy nó (VS2005) :)

using System.Reflection; 
namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      PropertyInfo[] tmp2 = typeof(TestClass).GetProperties(); 
      PropertyInfo test = typeof(TestClass).GetProperty(
       "TestProp", 
       BindingFlags.Instance | BindingFlags.Public | 
        BindingFlags.NonPublic); 

      Console.WriteLine(test.Name); 
     } 
    } 

    public class TestClass 
    { 
     public Int32 TestProp 
     { 
      get 
      { 
       return 0; 
      } 
      set 
      { 
      } 
     } 
    } 
} 
+0

Nếu tôi làm điều đó, GetProperties trả về không có gì là tốt, mà là phù hợp , ít nhất. Nhưng câu hỏi đặt ra là: tôi cần phải làm gì để tìm tài sản với GetProperty? Tại sao TestProp không được coi là một thuộc tính Instance? –

+0

... hoặc tôi cần làm gì với lớp TestClass để thuộc tính của nó xuất hiện dưới dạng thuộc tính thể hiện? –

+0

Tôi không thể sao chép vấn đề của bạn (mặc dù tôi đang sử dụng VS2005, vì vậy tôi đã phải xác thịt ra tài sản của bạn với một thực hiện). –

0

Bạn cần phải xác định cho dù đó là tĩnh hoặc một thể hiện (hoặc cả hai) quá.

+0

Xem nhận xét về bài đăng của Andrew Rolling ở trên. –

1

Cố gắng thêm thẻ sau:

System.Reflection.BindingFlags.Instance 

EDIT: này hoạt động (ít nhất là với tôi)

PropertyInfo test = typeof(TestClass).GetProperty("TestProp", BindingFlags.Public | BindingFlags.Instance); 

Console.WriteLine(test.Name); 
+0

Xem nhận xét về bài đăng của Andrew Rolling ở trên. –

+0

Bạn phải làm điều gì đó sai Remi bởi vì, với ví dụ bạn đã cho chúng tôi điều này hoạt động tốt ... –

+0

Nó cũng cho tôi, bây giờ, quá. Tôi không thể giải thích nó; đổ lỗi cho người dùng :-) Cảm ơn. –

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