La méthode setvalue pour la propriété est introuvable [duplicate]

Dec 13 2020

J'essaie de trouver un moyen de parcourir tous les champs de n'importe quel objet.

Tout d'abord, j'ai essayé d'utiliser la projection pour obtenir les champs de valeur et les imprimer, cela fonctionnait bien:

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

Cependant, bien sûr, je veux définir les champs sur de nouvelles valeurs, donc après avoir lu dessus, il semble que cela devrait fonctionner:

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

Cela me donne "méthode de jeu de propriétés introuvable". J'essaie également de donner null comme argument, ce qui est fait à certains endroits:

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

Cela a les mêmes résultats. Pourquoi cela échoue-t-il sur moi?

EDIT: On m'a fait remarquer que je n'ai pas suffisamment décrit mon objectif. Comme indiqué ci-dessus, le but est de parcourir les champs de n'importe quel objet, tout comme cet exemple d'objet:

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

Et puis aussi dans la question d'origine, j'écris "Je veux définir les champs sur de nouvelles valeurs", cela signifie que je voudrais parcourir les champs de l'objet "ob" et leur attribuer une nouvelle valeur.

Merci

Réponses

1 JonSkeet Dec 13 2020 at 22:26

Pourquoi cela échoue-t-il sur moi?

Pour la même raison que l'écriture

ob.DeclarativeSecn = "new value";

échouerait au moment de la compilation, du moins pour l'exemple que vous avez donné. Votre objet est un type anonyme et les propriétés des types anonymes n'ont que des getters - elles ne vous permettent pas de définir de nouvelles valeurs pour les propriétés. Si vous souhaitez pouvoir modifier les propriétés par la suite, n'utilisez pas de types anonymes.

Notez que votre question parlait d'itérer sur les propriétés de n'importe quel objet, mais:

  • Lors de l'impression, vous supposez que toutes les propriétés ont des getters; c'est généralement vrai, mais pas toujours
  • Lorsque vous définissez de nouvelles valeurs, vous supposez que toutes les propriétés ont des getters et qu'elles sont des propriétés de chaîne

Aucune de ces hypothèses n'est correcte en général . Donc, si vous voulez pouvoir gérer n'importe quel objet, vous devrez ajouter un peu plus de vérification.

ThomasWeller Dec 13 2020 at 22:31

Les types anonymes offrent un moyen pratique d'encapsuler un ensemble de propriétés en lecture seule dans un seul objet sans avoir à définir explicitement un type au préalable.

Soulignez le mien.

Il semble que vous ne pouvez pas définir une valeur sur une propriété en lecture seule. Semble raisonnable.