O método setvalue para a propriedade não pode ser encontrado [duplicado]

Dec 13 2020

Estou tentando encontrar uma maneira de iterar por todos os campos de qualquer objeto.

Em primeiro lugar, tentei usar a projeção para obter os campos de valor e imprimi-los, funcionou bem:

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

No entanto, é claro, eu quero definir os campos com alguns novos valores, então, depois de ler sobre isso, parece que isso deve funcionar:

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

Isso me dá "método de definição de propriedade não encontrado". Eu também tento dar null como argumento, o que é feito em alguns lugares:

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

Isso tem os mesmos resultados. Por que isso falha em mim?

EDIT: Foi-me dito que não descrevi suficientemente o meu objetivo. Conforme declarado acima, o objetivo é iterar pelos campos em qualquer objeto, assim como este objeto de exemplo:

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

E também na pergunta original, eu escrevo "Eu quero definir os campos para alguns novos valores", isso significa que eu gostaria de iterar os campos no objeto "ob" e defini-los com um novo valor.

Obrigado

Respostas

1 JonSkeet Dec 13 2020 at 22:26

Por que isso falha em mim?

Pela mesma razão que escrever

ob.DeclarativeSecn = "new value";

iria falhar em tempo de compilação, pelo menos para o exemplo que você deu. Seu objeto é um tipo anônimo e as propriedades em tipos anônimos têm apenas getters - eles não permitem que você defina novos valores para as propriedades. Se você quiser modificar as propriedades posteriormente, não use tipos anônimos.

Observe que sua pergunta se refere a iterar as propriedades de qualquer objeto, mas:

  • Ao imprimir, você está assumindo que todas as propriedades têm getters; isso geralmente é verdade, mas nem sempre
  • Ao definir novos valores, você está assumindo que todas as propriedades têm getters e que são propriedades de string

Nenhuma dessas suposições está correta em geral . Portanto, se você quiser manipular qualquer objeto, precisará adicionar mais verificações.

ThomasWeller Dec 13 2020 at 22:31

Os tipos anônimos fornecem uma maneira conveniente de encapsular um conjunto de propriedades somente leitura em um único objeto sem ter que definir explicitamente um tipo primeiro.

Ênfase minha.

Parece que você não pode definir um valor em uma propriedade somente leitura. Parece razoável.