2010-11-02 38 views
5

Tôi truy cập giá trị thuộc tính từ đối tượng lớp vào thời gian chạy bằng cách sử dụng phản chiếu trong C#.C# - Tìm nạp giá trị thuộc tính từ lớp con

public bool GetValue(string fieldName, out object fieldValue) 
    { 
     // Get type of current record 
     Type curentRecordType = _currentObject.GetType(); 
     PropertyInfo property = curentRecordType.GetProperty(fieldName); 

     if (property != null) 
     { 
      fieldValue = property.GetValue(_currentObject, null).ToString(); 
      return true; 
     } 
     else 
     { 
      fieldValue = null; 
      return false; 
     } 
    } 

Tôi chuyển Tên thuộc tính làm tham số: fieldName cho phương thức này. Bây giờ, tôi cần truy cập một giá trị thuộc tính từ đối tượng con của lớp trên ở thời gian chạy.
Có ai ở đó vui lòng hướng dẫn cách tôi có thể truy cập giá trị thuộc tính đối tượng con không?

+0

Bạn có gặp sự cố hoặc có câu hỏi khác ở đây không? – leppie

+0

đã chỉnh sửa câu hỏi của tôi, cần một cách để truy cập giá trị thuộc tính đối tượng con. – iniki

Trả lời

6

Vì bạn muốn có thể tìm thấy các đối tượng trên các đối tượng con tùy ý lồng nhau, bạn cần một hàm mà bạn có thể gọi đệ quy. Điều này là phức tạp bởi thực tế là bạn có thể có trẻ em tham khảo lại cha mẹ của họ, vì vậy bạn cần phải theo dõi các đối tượng mà bạn đã nhìn thấy trước đó trong tìm kiếm của bạn.

static bool GetValue(object currentObject, string propName, out object value) 
{ 
    // call helper function that keeps track of which objects we've seen before 
    return GetValue(currentObject, propName, out value, new HashSet<object>()); 
} 

static bool GetValue(object currentObject, string propName, out object value, 
        HashSet<object> searchedObjects) 
{ 
    PropertyInfo propInfo = currentObject.GetType().GetProperty(propName); 
    if (propInfo != null) 
    { 
     value = propInfo.GetValue(currentObject, null); 
     return true; 
    } 
    // search child properties 
    foreach (PropertyInfo propInfo2 in currentObject.GetType().GetProperties()) 
    { // ignore indexed properties 
     if (propInfo2.GetIndexParameters().Length == 0) 
     { 
      object newObject = propInfo2.GetValue(currentObject, null); 
      if (newObject != null && searchedObjects.Add(newObject) && 
       GetValue(newObject, propName, out value, searchedObjects)) 
       return true; 
     } 
    } 
    // property not found here 
    value = null; 
    return false; 
} 

Nếu bạn biết những gì con phản đối tài sản của bạn là ở bạn chỉ có thể vượt qua các đường dẫn đến nó, như vậy:

public bool GetValue(string pathName, out object fieldValue) 
{ 
    object currentObject = _currentObject; 
    string[] fieldNames = pathName.Split("."); 

    foreach (string fieldName in fieldNames) 
    { 
     // Get type of current record 
     Type curentRecordType = currentObject.GetType(); 
     PropertyInfo property = curentRecordType.GetProperty(fieldName); 

     if (property != null) 
     { 
      currentObject = property.GetValue(currentObject, null).ToString(); 
     } 
     else 
     { 
      fieldValue = null; 
      return false; 
     } 
    } 
    fieldValue = currentObject; 
    return true; 
} 

Thay vì gọi nó như GetValue("foo", out val) bạn sẽ gọi nó như GetValue("foo.bar", out val).

+0

không cho phép tên đường dẫn cho mỗi thuộc tính trong trường hợp của tôi vì có hàng trăm thuộc tính. Muốn một cách ngắn gọn và hiệu quả trong đó mã của tôi có thể đi xuống đối tượng con và tìm nạp giá trị thuộc tính chỉ cho đối tượng cha và Tên thuộc tính làm đầu vào. – iniki

+0

Vì vậy, bạn đang nói rằng bạn có một cây các đối tượng trong đó mỗi thuộc tính trong số tất cả các đối tượng có một tên duy nhất, và bạn muốn có thể tìm thấy một thuộc tính lồng nhau tùy ý chỉ được đặt tên của nó? (nếu bạn có foo.bar.baz.qux, bạn muốn chỉ cần chuyển vào "qux" và có chức năng tìm ra rằng nó nằm trong 'foo.bar.baz ') – Gabe

+0

có, chỉ cần nhập đối tượng chính và Tên Thuộc tính – iniki

0

Lấy đối tượng con bằng cách sử dụng sự phản chiếu, sau đó sử dụng phản chiếu để có được giá trị theo cùng một cách.

+0

bạn có nghĩa là bằng cách sử dụng GetNestedTypes()? – iniki

0
public void Main(){ 
    var containerObject = new ContainerObject(); 
    object propertyValue; 
    object nestedPropertyValue; 
    if(GetValue(containerObject, "FirstPropertyName", out propertyValue){ 
     bool success = GetValue(propertyValue, "NestedPropertyName", out nestedPropertyValue); 
    } 

} 

public bool GetValue(object currentObject, string propertyName, out object propertyValue) 
{ 
    // Get type of current record 
    var currentObjectType = currentObject.GetType(); 
    PropertyInfo propertyInfo = currentObjectType.GetProperty(propertyName); 

    propertyValue = propertyInfo != null 
        ? propertyInfo.GetValue(currentObject,null) 
        : null; 
    return propertyValue == null; 
} 
+0

Cảm ơn smartcaveman, nhưng tôi không trước mà tài sản cụ thể của đối tượng chính sẽ là cha mẹ cho thuộc tính lồng nhau. Trong trường hợp đó, đoạn mã của bạn sẽ không giải quyết được sự cố của tôi. – iniki

+0

Bạn có thể nhận được tất cả các thuộc tính bằng cách sử dụng GetProperties thay vì GetProperty (tên). Tôi có thể giúp bạn nhiều hơn nếu bạn sẽ xác định rõ hơn mục tiêu. – smartcaveman

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