3

我在 3rd 方库中有一个类,只有一个get;属性。

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

我想Name使用反射或任何其他合适的方法设置属性,但我不知道 Name 从哪里获取它的值。我的意思是我不知道它是否有这样的支持字段?

private string m_name;

或者是这样的:

public string Name {get; private set;}

我该如何设置?

4

1 回答 1

5

您需要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;
}

否则,该属性可能已计算并且没有支持字段。

于 2017-11-14T22:36:49.177 回答