Установка свойства {get;} с использованием отражения в C#

У меня есть класс в сторонней библиотеке только с get; имущество.

public class Person
{
    public string Name {get;}
}

Я хочу установить Name свойство, используя Reflection или любой другой подходящий метод, но я не знаю, откуда Имя получает свое значение. Я имею в виду, я не знаю, есть ли у него поле поддержки, как это?

private string m_name;

или это так:

public string Name {get; private set;}

Как я могу установить это?

1 ответ

Решение

Вам необходимо получить FieldInfo экземпляр для резервного поля свойства и вызвать SetValue() метод.

Mono.Reflection библиотека (доступна в диспетчере пакетов) поможет вам найти поле поддержки.

Если свойство является авто-собственностью, вы можете позвонить GetBackingField() метод расширения на PropertyInfo пример.

В противном случае вам придется разобрать IL из MethodInfo из геттера, как это:

var instructions = yourProp.GetGetMethod().GetInstructions();

Это даст вам список инструкций метода IL. Если они выглядят так:

Ldarg0
Ldfld    (Backing Field)
Ret

Затем 2-я инструкция предоставит вам поле поддержки. В коде:

if (instructions.Count == 3 && instructions[0].OpCode == OpCodes.Ldarg_0 && instructions[1].OpCode == OpCodes.Ldfld && instructions[2].OpCode == OpCodes.Ret)
{
    FieldInfo backingField = (FieldInfo)instructions[1].Operand;
}

В противном случае, свойство, вероятно, вычисляется и не имеет вспомогательного поля.

Другие вопросы по тегам