2010-05-26 23 views
9

Đây là một kịch bản được tạo ra để giúp hiểu những gì Im đang cố gắng đạt được.C# Sử dụng sự phản chiếu để nhận các thuộc tính của đối tượng chung (và các đối tượng lồng nhau)

Tôi đang cố gắng tạo phương thức trả về thuộc tính được chỉ định của đối tượng chung

ví dụ:

public object getValue<TModel>(TModel item, string propertyName) where TModel : class{ 
    PropertyInfo p = typeof(TModel).GetProperty(propertyName); 
    return p.GetValue(item, null); 
} 

Đoạn mã trên hoạt động tốt nếu bạn đang tìm kiếm một tài sản trên TModel item ví dụ

string customerName = getValue<Customer>(customer, "name"); 

Tuy nhiên, nếu bạn muốn biết tên nhóm của khách hàng là gì, nó sẽ trở thành vấn đề: ví dụ:

string customerGroupName = getValue<Customer>(customer, "Group.name"); 

Hy vọng ai đó có thể cho tôi một số thông tin chi tiết về cách thoát này - cảm ơn.

Trả lời

3

Trong namespace System.Web.UI có một phương pháp để làm điều đó:

DataBinder.Eval(source, expression); 
+0

UBER Legend ...! – Jimbo

+0

Bắt tốt. Chỉ có "vấn đề" tôi có với điều này là nó phụ thuộc vào System.Web.dll –

+0

Vâng nó có lẽ nên đi đến một lắp ráp – Guillaume86

3

Tôi đoán bạn chỉ cần để phá vỡ này xuống một vài bước chứ không phải cố gắng để làm tất cả trong một, một cái gì đó như:

// First get the customer group Property... 
CustomerGroup customerGroup = getValue<Customer>(customer, "Group"); 
// Then get the name of the group... 
if(customerGroup != null) 
{ 
    string customerGroupName = getValue<CustomerGroup>(customerGroup, "name"); 
} 
0

Kể từ khi Tập đoàn là tài sản của khách hàng, mà chính nó lưu trữ tên thuộc tính, bạn cũng phải đi theo cách này. Nhưng kể từ '.' không thể là một phần của tên thuộc tính mà bạn có thể dễ dàng sử dụng String.Substring để loại bỏ tên thuộc tính đầu tiên khỏi chuỗi và gọi phương thức của bạn đệ quy.

11

Đây là một phương pháp đơn giản sử dụng đệ quy để giải quyết vấn đề của bạn. Nó cho phép bạn duyệt qua một biểu đồ đối tượng bằng cách chuyển tên thuộc tính "chấm". Nó hoạt động với các thuộc tính cũng như các trường.

static class PropertyInspector 
{ 
    public static object GetObjectProperty(object item,string property) 
    { 
     if (item == null) 
      return null; 

     int dotIdx = property.IndexOf('.'); 

     if (dotIdx > 0) 
     { 
      object obj = GetObjectProperty(item,property.Substring(0,dotIdx)); 

      return GetObjectProperty(obj,property.Substring(dotIdx+1)); 
     } 

     PropertyInfo propInfo = null; 
     Type objectType = item.GetType(); 

     while (propInfo == null && objectType != null) 
     { 
      propInfo = objectType.GetProperty(property, 
         BindingFlags.Public 
        | BindingFlags.Instance 
        | BindingFlags.DeclaredOnly); 

      objectType = objectType.BaseType; 
     } 

     if (propInfo != null) 
      return propInfo.GetValue(item, null); 

     FieldInfo fieldInfo = item.GetType().GetField(property, 
         BindingFlags.Public | BindingFlags.Instance); 

     if (fieldInfo != null) 
      return fieldInfo.GetValue(item); 

     return null; 
    } 
} 

Ví dụ:

class Person 
{ 
    public string Name { get; set; } 
    public City City { get; set; } 
} 

class City 
{ 
    public string Name { get; set; } 
    public string ZipCode { get; set; } 
} 

Person person = GetPerson(id); 

Console.WriteLine("Person name = {0}", 
     PropertyInspector.GetObjectProperty(person,"Name")); 

Console.WriteLine("Person city = {0}", 
     PropertyInspector.GetObjectProperty(person,"City.Name")); 
+0

Truyền thuyết ......... – Jimbo

+0

Thanks a lot cho điều này, một phần tuyệt vời để học hỏi từ, tuy nhiên tôi đã chấp nhận một câu trả lời được xây dựng vào .NET – Jimbo

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