【问题标题】:setvalue method for property cannot be found [duplicate]找不到属性的setvalue方法[重复]
【发布时间】:2020-12-13 23:31:27
【问题描述】:

我正在尝试找到一种方法来遍历任何对象中的所有字段。

首先我尝试使用投影来获取值字段并打印它们,效果很好:

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

然后在原始问题中,我写了 “我想将字段设置为一些新值” 这意味着我想遍历“ob”对象中的字段,并将它们设置为新值。

谢谢

【问题讨论】:

    标签: c#


    【解决方案1】:

    为什么这对我来说失败了?

    和写作一样

    ob.DeclarativeSecn = "new value";
    

    至少在您给出的示例中会在编译时失败。您的对象是匿名类型,并且匿名类型的属性只有 getter - 它们不允许您为属性设置新值。如果您希望之后能够修改属性,请不要使用匿名类型。

    请注意,您的问题是关于迭代 any 对象的属性,但是:

    • 打印时,假设所有属性都有吸气剂;这通常是正确的,但并非总是如此
    • 设置新值时,您假设所有属性都有 getter 并且它们是字符串属性

    这些假设都不正确一般来说。因此,如果您希望能够处理 any 对象,则需要添加更多检查。

    【讨论】:

    • 是的,谢谢,您知道创建非匿名内联对象的好方法吗?这样我就不必为了简单的测试而去制作一个新课程?
    • @n00bster:对于您所展示的内容,您可以改用Dictionary<string, object>。我们真的不知道你想要实现什么更大的目标。
    【解决方案2】:

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

    强调我的。

    您似乎无法在只读属性上设置值。听起来很合理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多