J'utilise la réflexion pour remplir les propriétés d'un objet.Définition des propriétés d'un objet par réflexion avec différents types de propriétés
Ces propriétés ont différents types: cordes, Nullable (double) et Nullable (longue) (ne savent pas comment échapper aux crochets ici ...). Les valeurs de ces propriétés proviennent d'un dictionnaire de paires (chaîne, objet).
Ainsi, par exemple ma classe a les propriétés suivantes:
string Description { get; set; }
Nullable<long> Id { get; set; }
Nullable<double> MaxPower { get; set; }
(en réalité, il y a une douzaine de propriétés) et le dictionnaire auront des entrées comme < « Description », « Description »>, < "Id", 123456>, < "MaxPower", 20000>
maintenant, je me sers quelque chose comme ce qui suit pour définir les valeurs:
foreach (PropertyInfo info in this.GetType().GetProperties())
{
if (info.CanRead)
{
object thisPropertyValue = dictionary[info.Name];
if (thisPropertyValue != null && info.CanWrite)
{
Type propertyType = info.PropertyType;
if (propertyType == typeof(String))
{
info.SetValue(this, Convert.ToString(thisPropertyValue), null);
}
else if (propertyType == typeof(Nullable<double>))
{
info.SetValue(this, Convert.ToDouble(thisPropertyValue), null);
}
else if (propertyType == typeof(Nullable<long>))
{
info.SetValue(this, Convert.ToInt64(thisPropertyValue), null);
}
else
{
throw new ApplicationException("Unexpected property type");
}
}
}
}
Donc la question est: dois-je vraiment vérifier le type de chaque propriété avant d'attribuer la valeur? Y a-t-il quelque chose comme une distribution que je puisse effectuer afin que la valeur de la propriété soit affectée au type de la propriété correspondante?
Idéalement je voudrais être en mesure de faire quelque chose comme les suivants (que je naïvement pensé que pourrait avoir travaillé):
if (thisPropertyValue != null && info.CanWrite)
{
Type propertyType = info.PropertyType;
if (propertyType == typeof(String))
{
info.SetValue(this, (propertyType)thisPropertyValue, null);
}
}
Merci, Stefano
J'allais dire juste essayer info.SetValue (this, thisPropertyValue, null); mais cela semble être une meilleure solution. – ChrisF
+1 pour la méthode Convert.ChangeType. C'est une excellente solution pour éviter les ifs dans le code. –
@Marc: Merci, cela a fait l'affaire;) @ ChrisF: info.SetValue (cela, thisPropertyValue, null) a soulevé une exception en essayant de convertir int doubler dans un de mes cas de test. –