2009-08-12 11 views
5

Je souhaite utiliser la réflexion pour définir certains champs en fonction des données d'un fichier. Les informations que je peux avoir sont TypeName, TypeValue et FieldName.Utilisation de la réflexion pour définir la valeur d'un Int32

Bien que ce soit trivial sur les classes (Activator.CreateInstance et PropertyInfo.SetValue), je suis un peu stupéfait quand il s'agit de types de valeur comme Int32 qui n'a pas de propriétés. Je vois que IsValueType est vrai sur ces types, mais comme mon TypeValue est une chaîne (c.-à-d. String TypeValue = "400"), je ne sais pas comment l'assigner.

Dois-je utiliser GetMethods() pour vérifier s'il existe une méthode .Parse? Est-ce quelque chose pour un TypeConverter? Je sais que je pourrais juste coder en dur certains types de valeurs communs (il n'y en a pas beaucoup de toute façon) et avoir une grosse instruction switch(), mais je me demande s'il y a quelque chose qui fait automagiquement une conversion "Convertir String en T" ?

Répondre

7
// get the type converters we need 
TypeConverter myConverter = TypeDescriptor.GetConverter(typeof(int)); 

// get the degrees, minutes and seconds value 
int Degrees = (int)myConverter.ConvertFromString(strVal); 

cela devrait aider

+0

Il fait, TypeDescriptor classe est la magie que je cherchais, merci! –

4

ArsenMkrt est juste; TypeConverter est le chemin à parcourir ici; quelques pensées supplémentaires, cependant:

Vous pourriez envisager d'utiliser "modèle de composant" plutôt que de réflexion; c'est-à-dire au lieu de typeof(T).GetProperties(), considérons TypeDescriptor.GetProperties(typeof(T)). Cela vous donne un ensemble de PropertyDescriptor enregistrements au lieu de la réflexion PropertyInfo. Pourquoi est-ce pratique?

  • parce que les gens peuvent réellement spécifier un convertisseur par propriété (ci-dessous) - ceci est exposé comme prop.Converter sur PropertyDescriptor
  • si le fichier est grand, vous pouvez obtenir un gain de performances en utilisant HyperDescriptor

à titre d'exemple d'une propriété avec convertisseur de mesure:

[TypeConverter(typeof(CurrencyConverter))] // bespoke 
public decimal TotalPrice {get;set;} 
Questions connexes