我在 3rd 方库中有一个类,只有一个get;
属性。
public class Person
{
public string Name {get;}
}
我想Name
使用反射或任何其他合适的方法设置属性,但我不知道 Name 从哪里获取它的值。我的意思是我不知道它是否有这样的支持字段?
private string m_name;
或者是这样的:
public string Name {get; private set;}
我该如何设置?
我在 3rd 方库中有一个类,只有一个get;
属性。
public class Person
{
public string Name {get;}
}
我想Name
使用反射或任何其他合适的方法设置属性,但我不知道 Name 从哪里获取它的值。我的意思是我不知道它是否有这样的支持字段?
private string m_name;
或者是这样的:
public string Name {get; private set;}
我该如何设置?
您需要FieldInfo
为属性的支持字段获取一个实例并调用该SetValue()
方法。
该Mono.Reflection
库(在包管理器中可用)将帮助您找到支持字段。
如果属性是自动属性,您可以在实例上调用GetBackingField()
扩展方法。PropertyInfo
否则,您必须MethodInfo
像这样反汇编 getter 的 IL:
var instructions = yourProp.GetGetMethod().GetInstructions();
这将为您提供该方法的 IL 指令列表。如果它们看起来像这样:
Ldarg0
Ldfld (Backing Field)
Ret
然后第二条指令将为您提供支持字段。在代码中:
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;
}
否则,该属性可能已计算并且没有支持字段。