Using reflection to get values from properties from a list of a class

57,631

Solution 1

To Get/Set using reflection you need an instance. To loop through the items in the list try this:

PropertyInfo piTheList = MyObject.GetType().GetProperty("TheList"); //Gets the properties

IList oTheList = piTheList.GetValue(MyObject, null) as IList;

//Now that I have the list object I extract the inner class and get the value of the property I want

PropertyInfo piTheValue = piTheList.PropertyType.GetGenericArguments()[0].GetProperty("TheValue");

foreach (var listItem in oTheList)
{
    object theValue = piTheValue.GetValue(listItem, null);
    piTheValue.SetValue(listItem,"new",null);  // <-- set to an appropriate value
}

Solution 2

See if something like this helps you in the right direction: I got the same error a while back and this code snipped solved my issue.

PropertyInfo[] properties = MyClass.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
  if (property.Name == "MyProperty")
  {
   object value = results.GetType().GetProperty(property.Name).GetValue(MyClass, null);
   if (value != null)
   {
     //assign the value
   }
  }
}
Share:
57,631
Dustin Kingen
Author by

Dustin Kingen

Updated on July 18, 2022

Comments

  • Dustin Kingen
    Dustin Kingen almost 2 years

    I am trying to get the values from objects inside a list which is part of a main object.

    I have the main object which contains various properties which can be collections.

    Right now I am trying to figure out how to access a generic list which is contained in the object.

    ///<summary>
    ///Code for the inner class
    ///</summary>
    public class TheClass
    {
        public TheClass();
    
        string TheValue { get; set; }
    } //Note this class is used for serialization so it won't compile as-is
    
    ///<summary>
    ///Code for the main class
    ///</summary>
    public class MainClass
    {
        public MainClass();
    
        public List<TheClass> TheList { get; set; }
        public string SomeOtherProperty { get; set; }
        public Class SomeOtherClass { get; set }
    }
    
    
    public List<MainClass> CompareTheValue(List<object> MyObjects, string ValueToCompare)
    { 
        //I have the object deserialised as a list
        var ObjectsToReturn = new List<MainClass>();
        foreach(var mObject in MyObjects)
        {
    
            //Gets the properties
            PropertyInfo piTheList = mObject.GetType().GetProperty("TheList");
    
            object oTheList = piTheList.GetValue(MyObject, null);
    
    
            //Now that I have the list object I extract the inner class 
            //and get the value of the property I want
            PropertyInfo piTheValue = oTheList.PropertyType
                                              .GetGenericArguments()[0]
                                              .GetProperty("TheValue");
    
            //get the TheValue out of the TheList and compare it for equality with
            //ValueToCompare
            //if it matches then add to a list to be returned
    
            //Eventually I will write a Linq query to go through the list to do the comparison.
            ObjectsToReturn.Add(objectsToReturn);
    
        }
    return ObjectsToReturn;
    }
    

    I've tried to use a SetValue() with MyObject on this, but it errors out with (paraphrased):

    object is not of type

    private bool isCollection(PropertyInfo p)
    {
        try
        {
            var t = p.PropertyType.GetGenericTypeDefinition();
            return typeof(Collection<>).IsAssignableFrom(t) ||
                   typeof(Collection).IsAssignableFrom(t);
        }
        catch
        {
            return false;
        }
        }
    }