Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using reflection in C# to get properties of a nested object

Tags:

c#

reflection

Given the following objects:

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; } } 

I'd like to use reflection to go through the Invoice to get the Name property of a Customer. Here's what I'm after, assuming this code would work:

Invoice inv = GetDesiredInvoice();  // magic method to get an invoice PropertyInfo info = inv.GetType().GetProperty("BillTo.Address"); Object val = info.GetValue(inv, null); 

Of course, this fails since "BillTo.Address" is not a valid property of the Invoice class.

So, I tried writing a method to split the string into pieces on the period, and walk the objects looking for the final value I was interested in. It works okay, but I'm not entirely comfortable with it:

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; } 

Any ideas on how to improve this method, or a better way to solve this problem?

EDIT after posting, I saw a few related posts... There doesn't seem to be an answer that specifically addresses this question, however. Also, I'd still like the feedback on my implementation.

like image 610
jheddings Avatar asked Dec 23 '09 19:12

jheddings


People also ask

What is reflection in C?

Reflection provides objects (of type Type) that describe assemblies, modules, and types. You can use reflection to dynamically create an instance of a type, bind the type to an existing object, or get the type from an existing object and invoke its methods or access its fields and properties.

Is there reflection in C?

The Crefl API provides runtime access to reflection metadata for C structure declarations with support for arbitrarily nested combinations of: intrinsic, set, enum, struct, union, field (member), array, constant, variable. The Crefl reflection graph database format for portable reflection metadata.

What is using System reflection in C#?

Reflection in C# is used to retrieve metadata on types at runtime. In other words, you can use reflection to inspect metadata of the types in your program dynamically -- you can retrieve information on the loaded assemblies and the types defined in them.

What is the use of system reflection?

Reflection Namespace. Contains types that retrieve information about assemblies, modules, members, parameters, and other entities in managed code by examining their metadata. These types also can be used to manipulate instances of loaded types, for example to hook up events or to invoke methods.


1 Answers

I use following method to get the values from (nested classes) properties like

"Property"

"Address.Street"

"Address.Country.Name"

    public static object GetPropertyValue(object src, string propName)     {         if (src == null) throw new ArgumentException("Value cannot be null.", "src");         if (propName == null) throw new ArgumentException("Value cannot be null.", "propName");          if(propName.Contains("."))//complex type nested         {             var temp = propName.Split(new char[] { '.' }, 2);             return GetPropertyValue(GetPropertyValue(src, temp[0]), temp[1]);         }         else         {             var prop = src.GetType().GetProperty(propName);             return prop != null ? prop.GetValue(src, null) : null;         }     } 

Here is the Fiddle: https://dotnetfiddle.net/PvKRH0

like image 122
DevT Avatar answered Sep 20 '22 13:09

DevT