Je voudrais définir une propriété d'un objet via Reflection, avec une valeur de type string
. Donc, par exemple, supposons que j'ai une Ship
classe, avec une propriété de Latitude
, qui est a double
.
Voici ce que j'aimerais faire:
Ship ship = new Ship();
string value = "5.5";
PropertyInfo propertyInfo = ship.GetType().GetProperty("Latitude");
propertyInfo.SetValue(ship, value, null);
En l'état, cela lance un ArgumentException
:
L'objet de type 'System.String' ne peut pas être converti en type 'System.Double'.
Comment puis-je convertir la valeur au type approprié, en fonction de propertyInfo
?
c#
reflection
type-conversion
propertyinfo
setvalue
David Hodgson
la source
la source
Réponses:
Vous pouvez utiliser
Convert.ChangeType()
- Il vous permet d'utiliser des informations d'exécution sur n'importe quelIConvertible
type pour modifier les formats de représentation. Cependant, toutes les conversions ne sont pas possibles et vous devrez peut-être écrire une logique de cas particulier si vous souhaitez prendre en charge les conversions de types qui ne le sont pasIConvertible
.Le code correspondant (sans gestion des exceptions ni logique de cas particulier) serait:
la source
TryChangeType
ouCanChangeType
?Comme plusieurs autres l'ont dit, vous souhaitez utiliser
Convert.ChangeType
:En fait, je vous recommande de regarder l'ensemble de la
Convert
classe .Cette classe et de nombreuses autres classes utiles font partie de l'
System
espace de noms . Je trouve utile de scanner cet espace de noms tous les ans environ pour voir quelles fonctionnalités j'ai manquées. Essaie!la source
Je remarque que beaucoup de gens recommandent
Convert.ChangeType
- cela fonctionne dans certains cas, mais dès que vous commencez à impliquer desnullable
types, vous commencerez à recevoirInvalidCastExceptions
:Un wrapper a été écrit il y a quelques années pour gérer cela, mais ce n'est pas parfait non plus.
la source
J'ai essayé la réponse de LBushkin et cela a très bien fonctionné, mais cela ne fonctionnera pas pour les valeurs nulles et les champs nullables. Je l'ai donc changé en ceci:
la source
Vous pouvez utiliser un convertisseur de type (pas de vérification d'erreur):
En termes d'organisation du code, vous pouvez créer une sorte de mixage qui aboutirait à un code comme celui-ci:
Ceci serait réalisé avec ce code:
MPropertyAsStringSettable
peut être réutilisé pour de nombreuses classes différentes.Vous pouvez également créer vos propres convertisseurs de types personnalisés à attacher à vos propriétés ou classes:
la source
object
?object
ajouterait les méthodes d'extension à toutes les classes, ce qui n'est généralement pas souhaitable.Vous cherchez probablement la
Convert.ChangeType
méthode. Par exemple:la source
En utilisant
Convert.ChangeType
et obtention du type à convertir à partir duPropertyInfo.PropertyType
.la source
Je vais y répondre par une réponse générale. Habituellement, ces réponses ne fonctionnent pas avec les guides. Voici aussi une version de travail avec des guides.
la source
Ou vous pouvez essayer:
la source
Si vous écrivez l'application Metro, vous devez utiliser un autre code:
Remarque:
au lieu de
la source
L'utilisation du code suivant devrait résoudre votre problème:
la source
Cherchez-vous à jouer avec Reflection ou cherchez-vous à créer un logiciel de production? Je me demande pourquoi vous utilisez la réflexion pour définir une propriété.
la source
GenericProgramming.exe:ReflectionBenefits()
)