C # Reflection – L’object ne correspond pas au type de cible

J’essaie d’utiliser la méthode propertyInfo.SetValue () pour définir une valeur de propriété d’object avec reflection, et je reçois l’exception “L’object ne correspond pas au type de cible”. Cela n’a pas vraiment de sens (du moins pour moi!), Car j’essaie simplement de définir une propriété de chaîne simple sur un object avec une valeur de remplacement de chaîne. Voici un extrait de code – il est contenu dans une fonction récursive, il y a donc beaucoup plus de code, mais voici le courage:

PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties().FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower()); businessObject = fieldPropertyInfo.GetValue(businessObject, null); fieldPropertyInfo.SetValue(businessObject, replacementValue, null); 

J’ai vérifié que “businessObject” et “replacementValue” sont tous deux du même type en effectuant cette comparaison, qui renvoie true:

 businessObject.GetType() == replacementValue.GetType() 

Vous essayez de définir la valeur de la propriété propertyinfo. Parce que vous écrasez le businessObject

 PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties() .FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower()); // The result should be stored into another variable here: businessObject = fieldPropertyInfo.GetValue(businessObject, null); fieldPropertyInfo.SetValue(businessObject, replacementValue, null); 

Cela devrait être quelque chose comme:

 PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties() .FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower()); // also you should check if the propertyInfo is assigned, because the // given property looks like a variable. if(fieldPropertyInfo == null) throw new Exception(ssortingng.Format("Property {0} not found", f.Name.ToLower())); // you are overwriting the original businessObject var businessObjectPropValue = fieldPropertyInfo.GetValue(businessObject, null); fieldPropertyInfo.SetValue(businessObject, replacementValue, null); 

Je suppose que vous voulez juste supprimer la deuxième ligne. Que fait-il là de toute façon? Vous récupérez la valeur de la propriété à partir de l’object référencé par businessObject – et définissez-la sur la nouvelle valeur de businessObject . Donc, s’il s’agit vraiment d’une propriété de chaîne, la valeur de businessObject sera ensuite une référence de chaîne – et vous essayez ensuite de l’utiliser comme cible pour définir la propriété! C’est un peu comme faire ceci:

 dynamic businessObject = ...; businessObject = businessObject.SomeProperty; // This returns a ssortingng, remember! businessObject.SomeProperty = replacementValue; 

Cela ne va pas au travail.

ReplacementValue n’est pas clair – qu’il s’agisse de la chaîne de remplacement ou d’un object métier dans lequel extraire la valeur de remplacement réelle, mais je suppose que vous souhaitez soit:

 PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties() .FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower()); fieldPropertyInfo.SetValue(businessObject, replacementValue, null); 

Ou:

 PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties() .FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower()); object newValue = fieldPropertyInfo.GetValue(replacementValue, null); fieldPropertyInfo.SetValue(businessObject, newValue, null); 

Vous essayez de définir la valeur de la propriété sur businessObject sur une autre valeur du type businessObject , et non sur le type de cette propriété.

Pour que ce code fonctionne, replacementValue doit être du même type que le champ défini par piecesLeft[0] , et ce n’est évidemment pas ce type.