c#.使用反射设置成员对象值

本文关键字:成员对象 设置 反射 | 更新日期: 2023-09-27 18:14:18

我需要你的帮助下面的代码。基本上,我有一个名为"Job"的类,它有一些公共字段。我传递给我的方法"ApplyFilter"两个参数"job_in"answers"job_filters"。第一个参数包含实际数据,第二个参数包含指令(如果有的话)。我需要迭代"job_in"对象,读取它的数据,通过读取"job_filters"应用任何指令,修改数据(如果需要)并在新的"job_out"对象中返回它。一切工作正常,直到我需要将我的数据存储在"job_out"对象:

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

请帮助。我已经看到了一些使用属性的例子,但我很确定也可以用字段做同样的事情。谢谢!

c#.使用反射设置成员对象值

试试这个

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);
        }
    }
}
fields[i].SetValue(job_out, str_value);