2010-05-21 7 views
1

.Net framework contient une grande classe nommée Convert qui permet la conversion entre types simples, type DateTime et type de chaîne. Aussi la conversion en support de classe des types implémentant l'interface IConvertible.Conversion d'une chaîne en un type simple

La classe a été implémentée dans la toute première version du framework .Net. Il y avait quelques choses dans le premier framework .Net qui n'étaient pas faites correctement. Par exemple, les méthodes .Parse sur des types simples lèveraient une exception si la chaîne ne pouvait pas être analysée et il n'y aurait aucun moyen de vérifier si une exception serait projetée à l'avance.

Une future version de .Net Framework a supprimé cette lacune en présentant la méthode TryParse qui a résolu ce problème. La classe Convert remonte à l'ancienne méthode Parse, donc la méthode ChangeType de cette classe dans l'ancien style implémenté - si la conversion ne peut pas être effectuée, une exception est levée.

Jetez un oeil sur le code suivant:

public static T ConvertString<T>(string s, T @default) 
{ 
    try 
    { 
     return (T)Convert.ChangeType(s, typeof(T), CultureInfo.InvariantCulture); 
    } 
    catch (Exception) 
    { 
     return @default; 
    }    
} 

Ce code fait essentiellement ce que je veux. Cependant j'aimerais beaucoup éviter les laids essayer/attraper ici. Je suis sûr que, semblable à TryParse, il existe une méthode moderne de réécriture de ce code sans le fourre-tout. Pourriez-vous en suggérer un?

+0

Il n'y a pas de honte à utiliser un try/catch si cela n'arrive que rarement, par exemple si quelque chose est dans le mauvais format. C'est si vous frappez la prise la plupart du temps vous avez des problèmes de performance. – Chris

+0

Oui, ce serait une autre raison pour laquelle j'aimerais l'éviter. Parfois, il est difficile de prédire comment et où votre code va être utilisé/appelé, donc vous voulez le faire "bien". –

Répondre

1

Il n'y a pas une telle méthode, et il n'y en aura jamais.

Convert.Change appelle l'implémentation IConvertible de l'objet que vous transmettez pour effectuer la conversion.

Étant donné que l'interface IConvertible ne définit pas les méthodes TryConvertTo, il n'est pas possible d'écrire une méthode TryConvertTo. (Ajout de nouvelles méthodes pour IConvertible serait un changement majeur de rupture)

Il serait possible pour Microsoft pour créer une interface ISafeConvertible avec d'autres méthodes, mais je ne pense pas qu'ils le feront.

+0

Je veux dire méthode pas comme dans "méthode sur un type" mais méthode comme moyen de réaliser quelque chose. Merci pour votre réponse, cependant. Pour développer, je m'attendais à une nouvelle version différente de la classe Convert qui pourrait ne pas être liée à IConvertible en tant que telle. Ou quelque chose dans cette mesure. –

+0

Tout ce que vous pouvez faire est d'écrire votre propre déclaration 'switch'. – SLaks

Questions connexes