Cho các đối tượng sau:
public class Customer {
public String Name { get; set; }
public String Address { get; set; }
}
public class Invoice {
public String ID { get; set; }
public DateTime Date { get; set; }
public Customer BillTo { get; set; }
}
Tôi muốn sử dụng sự phản chiếu để đi qua Invoice
để lấy thuộc Name
tính của a Customer
. Đây là những gì tôi đang theo đuổi, giả sử mã này sẽ hoạt động:
Invoice inv = GetDesiredInvoice(); // magic method to get an invoice
PropertyInfo info = inv.GetType().GetProperty("BillTo.Address");
Object val = info.GetValue(inv, null);
Tất nhiên, điều này không thành công vì "BillTo.Address" không phải là thuộc tính hợp lệ của Invoice
lớp.
Vì vậy, tôi đã thử viết một phương thức để chia chuỗi thành nhiều phần trong khoảng thời gian và đi dọc các đối tượng để tìm kiếm giá trị cuối cùng mà tôi quan tâm. Nó hoạt động ổn, nhưng tôi không hoàn toàn thoải mái với nó:
public Object GetPropValue(String name, Object obj) {
foreach (String part in name.Split('.')) {
if (obj == null) { return null; }
Type type = obj.GetType();
PropertyInfo info = type.GetProperty(part);
if (info == null) { return null; }
obj = info.GetValue(obj, null);
}
return obj;
}
Bất kỳ ý tưởng về cách cải thiện phương pháp này, hoặc cách tốt hơn để giải quyết vấn đề này?
CHỈNH SỬA sau khi đăng, tôi thấy một vài bài viết liên quan ... Tuy nhiên, dường như không có câu trả lời nào giải quyết cụ thể câu hỏi này. Ngoài ra, tôi vẫn muốn phản hồi về việc triển khai của tôi.
GetDesiredInvoice
trả về cho bạn một đối tượng của loạiInvoice
tại sao không sử dụnginv.BillTo.Name
trực tiếp?