C#. Set a member object value using reflection

25,332

Solution 1

Try this

public static void MapAllFields(object source, object dst)
{
    System.Reflection.FieldInfo[] ps = source.GetType().GetFields();
    foreach (var item in ps)
    {
        var o = item.GetValue(source);
        var p = dst.GetType().GetField(item.Name);
        if (p != null)
        {
            Type t = Nullable.GetUnderlyingType(p.FieldType) ?? p.FieldType;
            object safeValue = (o == null) ? null : Convert.ChangeType(o, t);
            p.SetValue(dst, safeValue);
        }
    }
}

Solution 2

fields[i].SetValue(job_out, str_value);
Share:
25,332
Gary
Author by

Gary

Updated on August 01, 2022

Comments

  • Gary
    Gary almost 2 years

    I need your help with the following code below. Basically I have a class called "Job" which has some public fields. I'm passing to my method "ApplyFilter" two parameters "job_in" and "job_filters". First parameter contains actual data, and the second one has instructions (if any). I need to iterate through "job_in" object, read it's data, apply any instructions by reading "job_filters", modify data (if needed) and return it in a new "job_out" object. Everything works fine till i need to store my data in "job_out" object:

        public class Job
        {
            public string job_id = "";
            public string description = "";
            public string address = "";
            public string details = "";
        }
    

    ...

        private Job ApplyFilters(Job job_in, Job job_filters)
        {
    
            Type type = typeof(Job);
            Job job_out = new Job();
            FieldInfo[] fields = type.GetFields();
    
            // iterate through all fields of Job class
            for (int i = 0; i < fields.Length; i++)
            {
                List<string> filterslist = new List<string>();
                string filters = (string)fields[i].GetValue(job_filters);
    
                // if job_filters contaisn magic word "$" for the field, then do something with a field, otherwise just copy it to job_out object
                if (filters.Contains("$"))
                {
                    filters = filters.Substring(filters.IndexOf("$") + 1, filters.Length - filters.IndexOf("$") - 1);
                    // MessageBox.Show(filters);
                    // do sothing useful...
                }
                else
                {
                    // this is my current field value 
                    var str_value = fields[i].GetValue(job_in);
                    // this is my current filed name
                    var field_name = fields[i].Name;
    
                    //  I got stuck here :(
                    // I need to save (copy) data "str_value" from job_in.field_name to job_out.field_name
                    // HELP!!!
    
                }
            }
            return job_out;
        }
    

    Please help. I've seen a few samples by using properties, but i'm pretty sure it is possible to do the same with fields as well. Thanks!

  • JRoughan
    JRoughan over 12 years
    You probably don't need the second null check on 'o'. There's some nice defensive coding here, though.
  • Gary
    Gary over 12 years
    Bingo! Works like a charm. I knew it's something simple! Thank you! :)
  • Adam Robinson
    Adam Robinson over 12 years
    @JRoughan Is right; you're handling the case of o == null in your assignment of safeValue, so there's no need to check above.