c#反射,如何在类中获得属性实例来设置值

本文关键字:属性 实例 设置 反射 | 更新日期: 2023-09-27 18:10:08

我想在类的方法内将类的属性重置回其默认值。我的类被实例化一次(实际上是一个MVVM框架中的ViewModel),我不想破坏和重新创建整个ViewModel,只是清除了许多属性。下面的代码是我所拥有的。我唯一缺少的是如何获得SetValue方法的第一个参数-我知道它是我正在设置的属性的实例,但我似乎无法弄清楚如何访问它。我得到错误:"Object does not match target type".

public class myViewModel
{
  ...
  ...
  public void ClearFields()
  {
    Type type = typeof(myViewModel);
    PropertyInfo[] pi = type.GetProperties();
    foreach (var pinfo in pi)
    {
      object[] attributes = pinfo.GetCustomAttributes(typeof(DefaultValueAttribute), false);
      if (attributes.Length > 0)
      {
        DefaultValueAttribute def = attributes[0] as DefaultValueAttribute;
        pinfo.SetValue(?, def.Value, null);
      }
    }
  }
  ...
  ...

}

c#反射,如何在类中获得属性实例来设置值

您应该传递一个myViewModel的实例,在您的示例中使用this来引用当前实例:

public class myViewModel
{
  ...
  ...
  public void ClearFields()
  {
    Type type = typeof(myViewModel);
    PropertyInfo[] pi = type.GetProperties();
    foreach (var pinfo in pi)
    {
      object[] attributes = pinfo.GetCustomAttributes(typeof(DefaultValueAttribute), false);
      if (attributes.Length > 0)
      {
        DefaultValueAttribute def = attributes[0] as DefaultValueAttribute;
        pinfo.SetValue(this, def.Value, null);
      }
    }
  }
  ...
  ...
}

您应该将this作为第一个参数。参考MSDN:

objType:系统。对象

要设置其属性值的对象。