Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 找不到属性的setvalue方法_C# - Fatal编程技术网

C# 找不到属性的setvalue方法

C# 找不到属性的setvalue方法,c#,C#,我试图找到一种方法来遍历任何对象中的所有字段 首先,我尝试使用投影来获取值字段并打印它们,这非常有效: var ob = new {DeclarativeSecn = "da" , sksksk = "dingdong" }; foreach (PropertyInfo property in ob.GetType().GetProperties()) { Console.WriteLine(pro

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

首先,我尝试使用投影来获取值字段并打印它们,这非常有效:

 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”对象中的字段,并将它们设置为一个新值

多谢各位

为什么我会失败

因为和写作一样的原因

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

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

  • 打印时,假设所有属性都有getter;这通常是正确的,但并不总是如此
  • 设置新值时,假设所有属性都有getter,并且它们是字符串属性
总的来说,这两种假设都不正确。因此,如果您希望能够处理任何对象,则需要添加更多的检查

提供一种方便的方法,将一组只读属性封装到单个对象中,而无需先明确定义类型

我的


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

是的,谢谢你,你知道有什么好方法可以创建非匿名内联对象吗?这样我就不必在简单的测试中创建一个新类了?@n00bster:就您所展示的,您可以使用
字典来代替。我们真的不知道你想达到什么更大的目的。