Установка свойства {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;
}
В противном случае, свойство, вероятно, вычисляется и не имеет вспомогательного поля.