我试图找到一种方法来迭代任何对象中的所有字段。
首先,我尝试使用投影来获取值字段并打印它们,这很好地工作了:
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”对象中的字段,并将它们设置为一个新值。
谢谢
为什么这事对我不起作用?
因为同样的原因
ob.DeclarativeSecn = "new value";
将在编译时失败,至少对于您给出的示例是这样。您的对象是匿名类型,匿名类型上的属性只有getters-它们不允许您为属性设置新值。如果希望能够在事后修改属性,请不要使用匿名类型。
注意,您的问题谈到了迭代任何对象的属性,但是:
总的来说,这两种假设都不正确。因此,如果您想要能够处理任何对象,则需要添加更多的检查。
匿名类型提供了一种方便的方法,可以将一组只读属性封装到单个对象中,而不必先显式定义类型。
强调我的。
似乎不能在只读属性上设置值。听起来很合理。