surcharge - value c#




Définition d'une propriété par réflexion avec une valeur de chaîne (7)

Cherchez-vous à jouer avec Reflection ou cherchez-vous à construire un logiciel de production? Je voudrais savoir pourquoi vous utilisez la réflexion pour définir une propriété.

Double new_latitude;

Double.TryParse (value, out new_latitude);
ship.Latitude = new_latitude;

Je voudrais définir une propriété d'un objet via Reflection, avec une valeur de type string . Ainsi, par exemple, supposons que j'ai une classe Ship , avec une propriété de Latitude , qui est un 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 déclenche une ArgumentException :

L'objet de type 'System.String' ne peut pas être converti en type 'System.Double'.

Comment est-ce que je peux convertir la valeur au type approprié, basé sur propertyInfo ?


Comme plusieurs autres l'ont dit, vous voulez utiliser Convert.ChangeType :

propertyInfo.SetValue(ship,
    Convert.ChangeType(value, propertyInfo.PropertyType),
    null);

En fait, je vous recommande de regarder l'ensemble de la classe Convert .

Cette classe et de nombreuses autres classes utiles font partie de l' espace de noms System . Je trouve utile de balayer cet espace de noms tous les ans pour voir les fonctionnalités que j'ai ratées. Essaie!


Je remarque que beaucoup de personnes recommandent Convert.ChangeType - Cela fonctionne pour certains cas cependant dès que vous commencez à impliquer des types InvalidCastExceptions vous commencerez à recevoir InvalidCastExceptions :

http://weblogs.asp.net/pjohnson/archive/2006/02/07/Convert.ChangeType-doesn_2700_t-handle-nullables.aspx

Un emballage a été écrit il y a quelques années pour gérer cela mais ce n'est pas parfait non plus.

http://weblogs.asp.net/pjohnson/archive/2006/02/07/Convert.ChangeType-doesn_2700_t-handle-nullables.aspx


Ou vous pouvez essayer:

propertyInfo.SetValue(ship, Convert.ChangeType(value, propertyInfo.PropertyType), null);

//But this will cause problems if your string value IsNullOrEmplty...

Utilisation de Convert.ChangeType et obtention du type à convertir à partir de PropertyInfo.PropertyType .

propertyInfo.SetValue( ship,
                       Convert.ChangeType( value, propertyInfo.PropertyType ),
                       null );

Vous pouvez utiliser Convert.ChangeType() - Il vous permet d'utiliser des informations d'exécution sur n'importe IConvertible type IConvertible pour modifier les formats de représentation. Cependant, toutes les conversions ne sont pas possibles et vous devrez peut-être écrire une logique de casse spéciale si vous souhaitez prendre en charge les conversions provenant de types qui ne sont pas IConvertible .

Le code correspondant (sans manipulation d'exception ou logique de cas particulier) serait:

Ship ship = new Ship();
string value = "5.5";
PropertyInfo propertyInfo = ship.GetType().GetProperty("Latitude");
propertyInfo.SetValue(ship, Convert.ChangeType(value, propertyInfo.PropertyType), null);

Vous recherchez probablement la méthode Convert.ChangeType . Par exemple:

Ship ship = new Ship();
string value = "5.5";
PropertyInfo propertyInfo = ship.GetType().GetProperty("Latitude");
propertyInfo.SetValue(ship, Convert.ChangeType(value, propertyInfo.PropertyType), null);




setvalue