Using reflection to set a property of a property of an object

后端 未结 3 742
一生所求
一生所求 2021-01-12 19:24

I\'ve got two classes.

public class Class1 {
   public string value {get;set;}
}

public class Class2 {
   public Class1 myClass1Object {get;set;}
}
<         


        
相关标签:
3条回答
  • 2021-01-12 19:54

    Basically split it into two property accesses. First you get the myClass1Object property, then you set the value property on the result.

    Obviously you'll need to take whatever format you've got the property name in and split it out - e.g. by dots. For example, this should do an arbitrary depth of properties:

    public void SetProperty(object source, string property, object target)
    {
        string[] bits = property.Split('.');
        for (int i=0; i < bits.Length - 1; i++)
        {
             PropertyInfo prop = source.GetType().GetProperty(bits[i]);
             source = prop.GetValue(source, null);
        }
        PropertyInfo propertyToSet = source.GetType()
                                           .GetProperty(bits[bits.Length-1]);
        propertyToSet.SetValue(source, target, null);
    }
    

    Admittedly you'll probably want a bit more error checking than that :)

    0 讨论(0)
  • 2021-01-12 19:54
       public static object GetNestedPropertyValue(object source, string property)
        {
            PropertyInfo prop = null;
            string[] props = property.Split('.');
    
            for (int i = 0; i < props.Length; i++)
            {
                prop = source.GetType().GetProperty(props[i]);
                source = prop.GetValue(source, null);
            }
            return source;
        }
    
    0 讨论(0)
  • 2021-01-12 20:07

    I was looking for answers to the case where to Get a property value, when the property name is given, but the nesting level of the property is not known.

    Eg. if the input is "value" instead of providing a fully qualified property name like "myClass1Object.value".

    Your answers inspired my recursive solution below:

    public static object GetPropertyValue(object source, string property)
    {
        PropertyInfo prop = source.GetType().GetProperty(property);
        if(prop == null)
        {
          foreach(PropertyInfo propertyMember in source.GetType().GetProperties())
          { 
             object newSource = propertyMember.GetValue(source, null);
             return GetPropertyValue(newSource, property);
          }
        }
        else
        {
           return prop.GetValue(source,null);
        }
        return null;
    }
    
    0 讨论(0)
提交回复
热议问题