Передавать в метод поле класса

159
07 августа 2018, 23:40

По мере получения данных, изменяю значение полей у элементов класса(List<'User1>).Возможно ли сделать метод, в который можно было бы передать какое именно поле необходимо изменять? Часть кода, в котором необходимо менять поле.

for (int i = 0; i < first.Count; i++)
            {
                foreach (var v in Test)
                {
                    v.Name(<--это) += result[i] + " ";
                    i++;
                }
                Array.Clear(result, 0, 19);
            }

Отдельно выше метода лежат GetValue и SetValue

Вот код метода в общем:

void fills(List<string> first, List<User1> Test, string fieldN)
        {
            string[] result = new string[20];
            for (int i = 0; i < first.Count; i++)
            {
                foreach (var v in first)
                {
                    result[i] += v + " ";
                    i++;
                }
            }
            //for (int i = 0; i < result.Length; i++)
            //{
            //    testbox.Text += result[i] + " ";
            //}
                for (int i = 0; i < first.Count; i++)
                {
                    foreach (var v in Test)
                    {
                    SetValue(v, fieldN, Convert.ToString(GetValue(v, fieldN)) + result[i] + " ");
                    i++;
                    }
                    Array.Clear(result, 0, 19);
                }
            }
Answer 1
private object GetValue(object aParent, string aFieldName)
{
  FieldInfo field = aParent.GetType().GetField(aFieldName);
  if (field != null)
    return field.GetValue(aParent);
  PropertyInfo prop = aParent.GetType().GetProperty(aFieldName);
  if (prop != null)
    return prop.GetValue(aParent);
  return null;
}
private void SetValue(object aParent, string aFieldName, object aValue)
{
  FieldInfo field = aParent.GetType().GetField(aFieldName);
  if (field != null)
    field.SetValue(aParent, aValue);
  PropertyInfo prop = aParent.GetType().GetProperty(aFieldName);
  if (prop != null)
    prop.SetValue(aParent, aValue);
}

SetValue(v, "Name", Convert.ToString(GetValue(v, "Name")) + result[i] + " ");
Answer 2

Возможно, вам подойдёт следующий подход:

using System;
using System.Collections.Generic;
namespace ConApp
{
    class Program
    {
        static List<Person> people = new List<Person> {
            new Person { Age = 20, Name = "Smit" },
            new Person { Age = 30, Name = "John" } };
        public static void Main(string[] args)
        {
            Print();
            Do(p => p.Name += "!");
            Print();
            Do(p => p.Age += 1);
            Print();
        }
        static void Do(Action<Person> act)
        {
            foreach (var p in people)
                act(p);
        }
        static void Print()
        {
            foreach (var p in people)
                Console.WriteLine(p.Age + " " + p.Name);
            Console.WriteLine();
        }
    }
    class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
    }
}

Метод Do принимает Action<Person>. При его вызове можно указать конкретное свойство, причём всё будет строго типизировано.

READ ALSO
Помогите реализовать через класс

Помогите реализовать через класс

Коротко говоря пж помогите есть код который кидает информацию в БД знаю как сделать штобы с формы кидало но хотелось ето в классе чтобы не дублировать...

139
Не компилируется проект

Не компилируется проект

Не компилируется проект в MSVS2015 подNET Framework 4

121
C# вопрос по AngleSharp

C# вопрос по AngleSharp

Нужная мне информация для парсинга храниться например в таком виде

292
C# WPF MVVM MenuItem Template

C# WPF MVVM MenuItem Template

Как изменять Template для MenuItem на топ уровне?

171