跳转至

自动属性

当定义了如下类时,编译器会自动为它生成一个隐藏的、名称不固定的私有字段(比如可能叫 <L_A>k__BackingField这类编译器生成的名字 )而不是代码里写的 name。所以当通过反射给 Name 属性赋值时,修改的是编译器生成的那个隐藏字段,和你手动定义的 name 无关。

public class Person
{
    private string name;
    public string Name { get; set; }
}

解决方法

  • 改用手动实现属性(让属性直接操作name字段 )
public class Person
{
    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}
  • 反射直接操作 name 字段(不通过属性)
// 假设 obj 是包含这些成员的对象实例object
obj = new YourClass(); 
Type type = obj.GetType();
// 注意字段名是 "l\_A",区分大小写FieldInfo
 fieldInfo = type.GetField("name", BindingFlags.Instance | BindingFlags.NonPublic);
  if (fieldInfo != null)
  { 
    fieldInfo.SetValue(obj, 123.45); // 直接给私有字段赋值
  }