C #. Установите значение объекта-члена с помощью отражения

#c# #reflection #field #loops

#c# #отражение #поле #циклы

Вопрос:

Мне нужна ваша помощь со следующим кодом ниже. В принципе, у меня есть класс под названием «Job», в котором есть несколько общедоступных полей. Я передаю своему методу «applyFilter» два параметра «job_in» и «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;
    }
  

Пожалуйста, помогите. Я видел несколько примеров с использованием свойств, но я почти уверен, что то же самое можно сделать и с полями. Спасибо!

Ответ №1:

Попробуйте это

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

Комментарии:

1. Вероятно, вам не нужна вторая проверка null для ‘o’. Однако здесь есть несколько хороших защитных кодов.

2. @JRoughan прав; вы рассматриваете случай o == null в своем назначении safeValue , поэтому нет необходимости проверять выше.

Ответ №2:

 fields[i].SetValue(job_out, str_value);
  

Комментарии:

1. Бинго! Работает как по волшебству. Я знал, что это что-то простое! Спасибо! 🙂