Отражение: как получить объект класса через PropertyInfo - PullRequest
0 голосов
/ 15 января 2020

У меня 2 класса. ClassA имеет несколько объектов ClassB , называемых Field01, Field02, ... В классе A также есть список элементов ClassB.

Я знаю имя элементов ClassB и хочу заполнить элементы ClassB значениями из списка.

Пример кода:

public class ClassA
{
    public ClassB Field01 {get;set;}
    public ClassB Field02 {get;set;}
    //...

    List<ClassB> myItems;

    public void FillItems()
    {
        foreach(var item in MyItems)
        {
           // what I want in hardcode:
           Field01.ValueA = MyItems[0].ValueA;
           Field01.ValueB = MyItems[0].ValueB;
           Field02.ValueA = MyItems[1].ValueA;
           // ...
        }
    }
}

public class ClassB 
{
    public string ValueA {get;set;}
    public string ValueB {get;set;}
}

В моем случае я иметь переменную подсчета, которая создаст имена Field01, Field02, Field03, ... в зависимости от того, сколько элементов в моем списке (полей в ClassA всегда достаточно для заполнения)

Я знаю, что могу получить PropertyInfo моих элементов ClassB по имени, но я вас не знаю, я могу получить доступ к атрибутам ClassB ValueA и ValueB

// If ClassB was just a string or object this would work
Type myType = typeof(ClassA);
PropertyInfo myPropInfo = myType.GetProperty("Field01");
myPropInfo.SetValue(this, "Hello", null);

1 Ответ

1 голос
/ 15 января 2020

Поскольку вы знаете, что тип объявления свойств ClassB, вы можете получить PropertyInfo из ValueA и ValueB. Затем вам нужно получить значение FieldXX (не устанавливать!) И установить ValueA и ValueB.

Мы собираемся иметь дело с несколькими Type, PropertyInfo и object объектами, поэтому вы должны называть свои переменные соответствующим образом, а не просто myPropInfo или myType.

for (int i = 0 ; i < MyItems.Count ; i++) {
    var classAType = typeof(ClassA);
    var classBType = typeof(ClassB);
    var fieldInfo = classAType.GetProperty("Field" + $"{i}".PadLeft(2, '0'));
    var fieldValue = fieldInfo.GetValue(this);
    var valueAInfo = classBType.GetProperty(nameof(ClassB.ValueA));
    var valueBInfo = classBType.GetProperty(nameof(ClassB.ValueB));
    valueAInfo.SetValue(fieldValue, valueAInfo.GetValue(MyItems[i]));
    valueBInfo.SetValue(fieldValue, valueBInfo.GetValue(MyItems[i]));
}
...