Je veux convertir une chaîne en une valeur de propriété d'objet, dont j'ai le nom en tant que chaîne. J'essaie de faire ça comme ça:
string modelProperty = "Some Property Name";
string value = "SomeValue";
var property = entity.GetType().GetProperty(modelProperty);
if (property != null) {
property.SetValue(entity,
Convert.ChangeType(value, property.PropertyType), null);
}
Le problème est qu'il échoue et lève une exception de conversion non valide lorsque le type de propriété est un type nullable. Ce n'est pas le cas des valeurs ne pouvant pas être converties - elles fonctionneront si je le fais manuellement (par exemple DateTime? d = Convert.ToDateTime(value);
), j'ai vu des questions similaires mais je n'arrive toujours pas à le faire fonctionner.
c#
.net
reflection
iboeno
la source
la source
Réponses:
Non testé, mais peut-être que quelque chose comme ça fonctionnera:
la source
(value == null) ? null
utiliser(value == null) ? default(t)
?safeValue
variable au lieu de simplement la réaffecter àvalue
?Vous devez obtenir le type sous-jacent pour ce faire ...
Essayez ceci, je l'ai utilisé avec succès avec des génériques:
Je l'utilise à plusieurs endroits dans mon code, un exemple est une méthode d'aide que j'utilise pour convertir les valeurs de base de données de manière sécurisée:
Appelé en utilisant:
J'ai écrit une série de billets de blog, notamment à http://www.endswithsaurus.com/2010_07_01_archive.html (faites défiler vers le bas jusqu'à l'addendum, @JohnMacintyre a en fait repéré le bogue dans mon code d'origine, ce qui m'a conduit sur le même chemin que vous. maintenant). J'ai quelques petites modifications depuis ce post qui inclut également la conversion des types d'énumération, donc si votre propriété est une énumération, vous pouvez toujours utiliser le même appel de méthode. Ajoutez simplement une ligne pour vérifier les types d'énumération et vous partez pour les courses en utilisant quelque chose comme:
Normalement, vous auriez une erreur de vérification ou utiliser TryParse au lieu de Parse, mais vous obtenez l'image.
la source
C'est un peu long pour un exemple, mais c'est une approche relativement robuste, et sépare la tâche de transtypage d'une valeur inconnue en un type inconnu
J'ai une méthode TryCast qui fait quelque chose de similaire et prend en compte les types nullables.
Bien sûr TryCast est une méthode avec un paramètre de type, donc pour l'appeler dynamiquement, vous devez construire vous-même le MethodInfo:
Ensuite, pour définir la valeur réelle de la propriété:
Et les méthodes d'extension pour gérer les propriétés.CanAssignValue ...
la source
J'avais un besoin similaire, et la réponse de LukeH m'a orienté dans la direction. J'ai créé cette fonction générique pour le rendre facile.
L'utilisation est comme ceci:
Notez que le deuxième paramètre est juste utilisé comme prototype pour montrer à la fonction comment convertir la valeur de retour, il ne doit donc pas réellement être la propriété de destination. Cela signifie que vous pouvez également faire quelque chose comme ceci:
Je l'ai fait de cette façon au lieu d'utiliser un out parce que vous ne pouvez pas l'utiliser avec des propriétés. En l'état, il peut fonctionner avec des propriétés et des variables. Vous pouvez également créer une surcharge pour transmettre le type à la place si vous le souhaitez.
la source
Merci @LukeH
j'ai un peu changé:
la source
Je l'ai fait de cette façon
la source