2010-04-22 43 views
12

Cách tốt nhất để thực hiện điều này trong C# là gì?C# - Giá trị thuộc tính đệ quy/phản ánh

string propPath = "ShippingInfo.Address.Street"; 

Tôi sẽ có đường dẫn thuộc tính giống như đường dẫn được đọc ở trên từ tệp ánh xạ. Tôi cần có thể yêu cầu đối tượng Đơn đặt hàng giá trị của mã bên dưới sẽ là gì.

this.ShippingInfo.Address.Street 

Cân bằng hiệu suất với sự sang trọng. Tất cả các mối quan hệ đồ thị đối tượng nên là một-một. Phần 2: Làm thế nào cứng nó sẽ được thêm vào khả năng cho nó để lấy một trong những đầu tiên nếu nó là một danh sách <> hoặc một cái gì đó như nó.

Trả lời

25

Có lẽ một cái gì đó như thế này?

string propPath = "ShippingInfo.Address.Street"; 

object propValue = this; 
foreach (string propName in propPath.Split('.')) 
{ 
    PropertyInfo propInfo = propValue.GetType().GetProperty(propName); 
    propValue = propInfo.GetValue(propValue, null); 
} 

Console.WriteLine("The value of " + propPath + " is: " + propValue); 

Hoặc, nếu bạn thích LINQ, bạn có thể thử thay vào đó. (Mặc dù cá nhân tôi thích phiên bản không phải LINQ.)

string propPath = "ShippingInfo.Address.Street"; 

object propValue = propPath.Split('.').Aggregate(
    (object)this, 
    (value, name) => value.GetType().GetProperty(name).GetValue(value, null)); 

Console.WriteLine("The value of " + propPath + " is: " + propValue); 
+0

+1 vì ví dụ mã ngắn hơn mô tả văn bản * g * – Foxfire

+0

Tôi thích nó. Tôi đứng sửa chữa về những khó khăn trong việc thể hiện điều này.Triển khai LINQ tuyệt vời. – kmontgom

1

Âm thanh như một tập hợp các lời gọi thuộc tính lồng nhau:

lớp X có thuộc tính được gọi là ShippingInfo; loại được đại diện bởi ShippingInfo có một thuộc tính; loại được đại diện bởi Địa chỉ có thuộc tính được gọi là Đường phố.

Vì vậy, giả định rằng bạn biết trường hợp thích hợp của lớp X để vận hành khi: ("". ToCharArray())

  • tokenize chuỗi qua String.split đến một string [], hoặc một cái gì đó như thế
  • bắt đầu với những ví dụ nổi tiếng của X
  • sử dụng phản ánh để có được những MethodInfo cho getter ShippingInfo
  • sử dụng phản ánh để có được những loại trả về bởi ShippingInfo get()
  • gọi getter sử dụng phản ánh
  • sử dụng giá trị trả về từ ShippingInfo get() và Type của sự trở lại:
    • có được MethodInfo cho getter Địa chỉ trong các loại trở lại .....

v.v. Bạn nhận được hình ảnh.

Có vẻ hơi dài và tẻ nhạt, và đúng vậy. Nhưng đó là cách bạn sẽ làm điều đó thông qua sự phản chiếu.

Tôi tự hỏi liệu có thể làm điều tương tự với LINQ to Objects không?

Câu trả lời cho phần 2 liên quan đến việc nhận giá trị ban đầu của X từ Danh sách <>.

+0

Bạn có thể viết lại điều này không? Không phải rất dễ hiểu - quá nhiều từ :) – Nayan

+0

Không. Nếu có, nó quá ngắn gọn và thiếu chi tiết. Thats vấn đề với một cái gì đó giống như phản ánh, có nhiều bước và mỗi bước đòi hỏi kiến ​​thức cụ thể. Lấy làm tiếc. – kmontgom

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