Question

Mon scénario devrait être simple ... le type que je souhaite convertir FROM est TOUJOURS 'chaîne'. Ce que je veux convertir en ... pourrait être beaucoup de choses - ints, DateTimes, ... strings, etc.

Ce serait facile:

string valueToConvertFrom = "123";

int blah = Convert.ToInt32(valueToConvertFrom);

Cependant ... je ne sais pas (avant l'exécution) que la valeur que je dois convertir est un "Int" (ou autre chose). 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 instruction switch et à appeler "Convert.ToBlah". basé sur le nom du type ... des suggestions?

Était-ce utile?

La solution

La façon propre de le faire consiste à utiliser un convertisseur de type. vous pouvez obtenir une instance d'un convertisseur de type en appelant le TypeDescriptor .GetConverter , puis utilisez l’instance du convertisseur de type pour effectuer la conversion. donc quelque chose comme ça:

string valueToConvertFrom = "123";

Type convertToType = typeof(int);

TypeConverter tc =  TypeDescriptor.GetConverter(convertToType);             

object blah =tc.ConvertFromString(valueToConvertFrom);

Autres conseils

La classe String implémente IConvertible, ce code DEVRAIT tout simplement fonctionner. Quelle version de .NET visez-vous?

object o = Convert.ChangeType( str, convertToType );

En outre, la plupart des types que vous avez mentionnés implémentent la méthode Parse. Votre meilleure photo pourrait donc ressembler à 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 :/
}

La question de Timothy, telle qu’elle s’applique généralement à la question de la conversion de type dans .NET, est un très gros problème. Bien que les stratégies de conversion soient assez simples dans des scénarios spécifiques avec des types connus, il n’existe malheureusement aucune stratégie généralisée dans toute implémentation de .NET pour effectuer la conversion de Type au moment de l’exécution d’un Type arbitraire à un autre, et aucune stratégie de ce type n’est proposée par Redmond. Toutefois, Microsoft fournit de bonnes recommandations pour le concept général de conversion de type, notamment:

J'ai dû faire face au même problème général dans mes systèmes et, en tant que solution, j'ai regroupé toutes les stratégies standard en une seule méthode. La portée de ce numéro est large et les stratégies de conversion associées sont variées. Cette approche consolidée ne peut donc être traitée que dans un article technique complet. Cependant, j’offre ici une copie de la documentation de ma méthode dans l’espoir que cela vous aidera à bien comprendre les exigences générales que vous devrez traiter si vous souhaitez développer une solution similaire généralisée. Voici le lien vers ma documentation:

J'espère que cela vous aide,

Mark

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top