2009-11-04 43 views
7

Tôi có một đối tượng có số lượng lớn các thuộc tính. Tôi muốn nhận được giá trị của mỗi thuộc tính đó bằng cách lặp lại thông qua bộ sưu tập thuộc tính của đối tượng.Nhận giá trị thuộc tính động

Tôi đã xem xét phương thức PropertyInfo.GetValue() tuy nhiên nó không có ý nghĩa nhiều trong ngữ cảnh tôi có.

Dưới đây là một ví dụ về những gì tôi đang cố gắng để làm gì (mã này không hoạt động btw):

foreach(var item in dataObjects) 
    { 
    foreach(PropertyInfo prop in item.GetType().GetProperties()) 
    { 
     String value = prop.GetValue().ToString() 
    } 
    } 

Tôi nhận ra bây giờ mà nhận được giá trị của một tài sản không phải là điều này dễ dàng. Tôi đang thiếu gì? Tôi không thực sự hiểu những gì tôi cần phải vượt qua để các GetValue() phương pháp bởi vì tôi chỉ đơn giản muốn giá trị của tài sản tôi gọi phương pháp đó trên.

Cảm ơn bạn đã giúp tôi làm rõ điều này cho tôi. Tôi đã dành một vài giờ ở đây chỉ đập đầu vào bàn.

+2

Tính năng này thậm chí biên dịch như thế nào? – Tinister

+2

Không. Đó là một ví dụ về những gì tôi "muốn" để làm, không phải những gì mã thực sự làm. :) –

Trả lời

10

Bạn cần cung cấp các đối tượng cụ thể mà bạn muốn gọi bất động sản trong câu hỏi:

prop.GetValue(item, null); 

Các PropertyInfo chỉ là metatdata về tài sản vào loại, không phải trên trường hợp đối tượng cụ thể. PropertyInfo không biết nó đến từ đâu (nếu có) - chỉ là kiểu/lớp mà nó xuất phát.

Bạn gần như có thể nghĩ PropertyInfo chỉ là tên của thuộc tính. Đó là không đủ thông tin để làm bất cứ điều gì với nó một mình - chúng tôi sau đó phải nói "có được giá trị của tài sản với tên này trên ... những gì?" Về đối tượng chúng tôi cung cấp.

3

PropertyInfo đại diện cho chính máy móc thuộc tính (loại, phương thức nhận, phương thức thiết lập, v.v ...), không phải thuộc tính được liên kết với một cá thể cụ thể. Nếu thuộc tính không phải là nonstatic, bạn phải cung cấp một cá thể để đọc thuộc tính đó từ - đó là tham số đầu tiên của GetValue. Nói cách khác, nếu pi là một PropertyInfo đại diện cho Test tài sản trên một số lớp và someObject là một thể hiện của lớp đó:

object a = someObject.Test; 
object b = pi.GetValue(someObject, null); 

cả hai dòng có nhận được giá trị của các tài sản tương tự trên cùng một đối tượng. Nếu tài sản là tĩnh, bạn không cần phải vượt qua các trường hợp, rõ ràng (vượt qua null thay vì). Tham số thứ hai là chỉ mục cho các thuộc tính được lập chỉ mục - C# không hỗ trợ các thuộc tính được lập chỉ mục (nó hỗ trợ các chỉ mục, không chính xác như nhau), vì vậy bạn sẽ không bao giờ cần truyền bất kỳ thứ gì ngoài null cho tham số thứ hai trừ khi bạn đang làm việc với một số loại từ một assembly được viết bằng ngôn ngữ hỗ trợ các thuộc tính được lập chỉ mục (như VB, tôi tin).

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