提问者:小点点

找不到属性的setvalue方法[重复]


我试图找到一种方法来迭代任何对象中的所有字段。

首先,我尝试使用投影来获取值字段并打印它们,这很好地工作了:

 var ob = new {DeclarativeSecn = "da" , sksksk = "dingdong" };
       
 foreach (PropertyInfo property in ob.GetType().GetProperties())
      {
             Console.WriteLine(property.Name + " val " +  property.GetValue(ob));
       }

但是,当然,我想将这些字段设置为一些新的值,因此在阅读了它之后,看起来应该可以这样做:

 foreach (PropertyInfo property in ob.GetType().GetProperties())
      {
             property.SetValue(ob,"new String");
       }

这给了我“找不到属性集方法”。我还尝试给出null作为参数,在某些地方这样做:

 property.SetValue(ob,"new String",null);

这也有同样的结果。为什么这事对我不起作用?

编辑:有人向我指出我没有充分描述我的目标。如上所述,目标是遍历任何对象中的字段,就像这个示例对象:

 var ob = new {DeclarativeSecn = "da" , sksksk = "dingdong" };

在最初的问题中,我写了“I want to set the fields to some new values”,这意味着我希望遍历“ob”对象中的字段,并将它们设置为一个新值。

谢谢


共2个答案

匿名用户

为什么这事对我不起作用?

因为同样的原因

ob.DeclarativeSecn = "new value";

将在编译时失败,至少对于您给出的示例是这样。您的对象是匿名类型,匿名类型上的属性只有getters-它们不允许您为属性设置新值。如果希望能够在事后修改属性,请不要使用匿名类型。

注意,您的问题谈到了迭代任何对象的属性,但是:

  • 打印时,假设所有属性都有getter;这通常是正确的,但并不总是这样
  • 设置新值时,假设所有属性都有getter,并且它们都是字符串属性

总的来说,这两种假设都不正确。因此,如果您想要能够处理任何对象,则需要添加更多的检查。

匿名用户

匿名类型提供了一种方便的方法,可以将一组只读属性封装到单个对象中,而不必先显式定义类型。

强调我的。

似乎不能在只读属性上设置值。听起来很合理。