2008-11-23 6 views
21

Mon scénario devrait être simple ... le type que je veux convertir FROM est TOUJOURS 'chaîne'. Ce que je veux convertir ... pourrait être beaucoup de choses - ints, DateTimes, ... cordes, etc.Comment puis-je convertir des types au moment de l'exécution?

Ce serait facile:

string valueToConvertFrom = "123"; 

int blah = Convert.ToInt32(valueToConvertFrom); 

Mais ... Je ne sais pas (jusqu'à l'exécution) que la valeur que je dois convertir en est un 'Int' (ou peu importe). J'ai essayé ceci:

string valueToConvertFrom = "123"; 

Type convertToType = typeof(int); 

object blah = Convert.ChangeType(valueToConvertFrom, convertToType); 

Mais cela me donne l'erreur suivante: "L'objet doit implémenter IConvertible."

Je ne veux pas avoir à faire une déclaration de commutateur et appeler "Convert.ToBlah" basé sur le nom de type ... des suggestions?

+0

s'il vous plaît rouvrir et ajouter la réponse que vous avez trouvé, au cas où quelqu'un a d'autre le même ou un problème similaire à l'avenir –

+1

La raison pour laquelle j'ai fermé ceci est parce que mon code avait un bug dedans ... Je tirais d'abord du mauvais champ, et ce champ n'a pas implémenté IConvertible. +1 pour les deux réponses ... "La classe String implémente IConvertible, ce code DEVRAIT simplement fonctionner" c'est vrai. Mais la solution d'Asher est géniale car j'ai appris quelque chose de nouveau (et c'est une solution très propre). Merci encore! –

Répondre

30

la façon la plus simple de le faire est d'utiliser le TypeConverter. vous pouvez obtenir une instance d'un convertisseur de type en appelant le TypeDescriptor.GetConverter puis en utilisant l'instance du convertisseur de type pour effectuer la conversion. donc quelque chose comme ceci:

string valueToConvertFrom = "123"; 

Type convertToType = typeof(int); 

TypeConverter tc = TypeDescriptor.GetConverter(convertToType);    

object blah =tc.ConvertFromString(valueToConvertFrom); 
+0

Ceci est génial. Merci beaucoup! – Stephen

+2

La réponse d'Asher ne s'applique pas à Silverlight (web ou WP7x), où TypeDescriptor n'est pas disponible. En outre, TypeDescriptor renvoie uniquement un TypeConverter pour un Type qui a défini un TypeConverter, qui ne s'applique pas automatiquement à la plupart des Types. Et le TypeConverter retourné par TypeDescriptor est seulement le premier défini pour le Type donné. Vous ne pouvez donc généralement pas compter sur TypeDescriptor pour les scénarios de conversion, c'est le moins qu'on puisse dire. –

+1

Rappelez-vous également que TypeConverter n'est pas seulement une classe de base abstraite nécessitant une implémentation personnalisée si vous l'utilisez pour la conversion de classes personnalisées, mais aussi relativement plus lente que les autres mécanismes car elle est basée sur la réflexion/découverte. –

5

La classe String implémente IConvertible, ce code DEVRAIT simplement fonctionner. Quelle version de .NET viserez-vous? En outre, la plupart des types que vous avez mentionnés implémentent la méthode Parse, de sorte que votre meilleure image pourrait être quelque chose comme ceci.

Type convertToType = ...; 
MethodInfo mi = convertToType.GetMethod("Parse", BindingFlags.Static); 
object blah; 
if(mi != null) 
{ 
    blah = mi.Invoke(null, new object[]{valueToConvertFrom}); 
} 
else 
{ 
    // the type doesn't implement the Parse method, handle it another way :/ 
} 
+2

cela ressemble et se sent comme un hack ... – Asher

5

question de Timothy, telle qu'elle est appliquée généralement à la question de la conversion de type .NET, est un très gros problème. Alors que les stratégies de conversion sont assez simples dans des scénarios spécifiques avec des types connus, il n'y a malheureusement aucune stratégie généralisée dans une implémentation de .NET pour effectuer une conversion de Type à l'exécution d'un Type arbitraire à un autre. Cependant, Microsoft fournit quelques bonnes directives pour le concept général de conversion de type, y compris:

J'ai dû faire face à la même question générale dans mon systèmes, et en tant que solution, j'ai consolidé toutes les stratégies standard en une seule méthode. La portée de cette question est vaste et les stratégies de conversion connexes sont variées, de sorte que cette approche consolidée ne peut être couverte dans un article technique complet. Cependant, j'offre ici une copie de ma documentation sur les méthodes dans l'espoir que cela vous aidera à bien comprendre les exigences globales auxquelles vous devrez répondre si vous voulez développer une solution similaire et généralisée.Voici le lien vers ma documentation:

J'espère que cela vous aide,

Mark

Questions connexes