No se puede encontrar el método setvalue para la propiedad [duplicado]

Dec 13 2020

Estoy tratando de encontrar una manera de recorrer todos los campos en cualquier objeto.

En primer lugar, intenté usar la proyección para obtener los campos de valor e imprimirlos, esto funcionó muy bien:

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

Sin embargo, por supuesto, quiero establecer los campos en algunos valores nuevos, así que después de leerlo, parece que esto debería funcionar:

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

Esto me da "método de conjunto de propiedades no encontrado". También trato de dar null como argumento, lo que se hace en algunos lugares:

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

Esto tiene los mismos resultados. ¿Por qué esto me falla?

EDITAR: Se me ha señalado que no he descrito suficientemente mi objetivo. Como se indicó anteriormente, el objetivo es iterar a través de los campos en cualquier objeto, al igual que este objeto de ejemplo:

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

Y luego, también en la pregunta original, escribo "Quiero establecer los campos en algunos valores nuevos", esto significa que me gustaría recorrer los campos en el objeto "ob" y establecerlos en un nuevo valor.

Gracias

Respuestas

1 JonSkeet Dec 13 2020 at 22:26

¿Por qué esto me falla?

Por la misma razón que escribir

ob.DeclarativeSecn = "new value";

fallaría en tiempo de compilación, al menos para el ejemplo que ha dado. Su objeto es un tipo anónimo y las propiedades de los tipos anónimos solo tienen captadores; no le permiten establecer nuevos valores para las propiedades. Si desea poder modificar las propiedades posteriormente, no utilice tipos anónimos.

Tenga en cuenta que su pregunta habla de iterar sobre las propiedades de cualquier objeto, pero:

  • Al imprimir, está asumiendo que todas las propiedades tienen captadores; eso es comúnmente cierto, pero no siempre
  • Al establecer nuevos valores, está asumiendo que todas las propiedades tienen captadores y que son propiedades de cadena

Ninguno de esos supuestos es correcto en general . Entonces, si desea poder manejar cualquier objeto, deberá agregar más verificación.

ThomasWeller Dec 13 2020 at 22:31

Los tipos anónimos proporcionan una forma conveniente de encapsular un conjunto de propiedades de solo lectura en un solo objeto sin tener que definir explícitamente un tipo primero.

Énfasis mío.

Parece que no puede establecer un valor en una propiedad de solo lectura. Suena razonable.