C#Reflection,如何将类中的属性实例设置为setvalue

时间:2013-04-19 20:45:07

标签: c# reflection propertyinfo

我想将类的属性重置为类的方法中的默认值。我的类被实例化一次(实际上是MVVM框架中的ViewModel)并且我不想破坏和重新创建整个ViewModel,只是清除了许多属性。以下代码就是我所拥有的。我唯一缺少的是如何获取SetValue方法的第一个参数 - 我知道它是我正在设置的属性的一个实例,但我似乎无法弄清楚如何访问它。我收到错误:“对象与目标类型不匹配”。

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);
      }
    }

  }

  ...
  ...


}

2 个答案:

答案 0 :(得分:3)

您应该传递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);
      }
    }

  }

  ...
  ...

}

答案 1 :(得分:1)

您应该将this作为第一个参数。请参阅MSDN以获取参考:

  

objType:System.Object

     

将设置其属性值的对象。