J'essaye d'effectuer une conversion de données. Malheureusement, la plupart des données sont dans des chaînes, où elles devraient être des int ou double, etc ...
Donc, ce que j'ai, c'est quelque chose comme:
double? amount = Convert.ToDouble(strAmount);
Le problème avec cette approche est que si strAmount est vide, s'il est vide, je veux qu'il soit nul, donc lorsque je l'ajoute dans la base de données, la colonne sera nulle. Alors j'ai fini par écrire ceci:
double? amount = null;
if(strAmount.Trim().Length>0)
{
amount = Convert.ToDouble(strAmount);
}
Maintenant, cela fonctionne bien, mais j'ai maintenant cinq lignes de code au lieu d'une. Cela rend les choses un peu plus difficiles à lire, surtout lorsque j'ai un grand nombre de colonnes à convertir.
Je pensais que j'utiliserais une extension de la classe de chaîne et des génériques pour passer le type, c'est parce que cela pourrait être un double, ou un int, ou un long. Alors j'ai essayé ceci:
public static class GenericExtension
{
public static Nullable<T> ConvertToNullable<T>(this string s, T type) where T: struct
{
if (s.Trim().Length > 0)
{
return (Nullable<T>)s;
}
return null;
}
}
Mais j'obtiens l'erreur: impossible de convertir le type «chaîne» en «T?»
Y a-t-il un moyen de contourner ceci? Je ne suis pas très familier avec la création de méthodes utilisant des génériques.
la source
Réponses:
Une autre chose à garder à l'esprit est que la chaîne elle-même peut être nulle.
la source
Vous pouvez essayer d'utiliser la méthode d'extension ci-dessous:
De cette façon, vous pouvez faire ceci:
la source
Et ça:
Bien sûr, cela ne prend pas en compte l'échec de la conversion.
la source
J'ai écrit ce convertisseur de type générique. Il fonctionne avec les valeurs Nullable et standard, convertissant entre tous les types convertibles - pas seulement une chaîne. Il gère toutes sortes de scénarios auxquels vous vous attendez (valeurs par défaut, valeurs nulles, autres valeurs, etc.)
Je l'utilise depuis environ un an dans des dizaines de programmes de production, donc ça devrait être assez solide.
la source
OutOfMemoryException
si vous ne pouvez pas le réduire à un ensemble fixe de types d'exceptions.Vous voudrez peut-être essayer:
faites votre propre contrôle nul et retournez
int?
si nécessaire. Vous voudrez également envelopper cela dans untry {}
la source
Donnez-moi une chance ...
Alors appelez-le comme ça ...
la source
J'aime la réponse de Joel, mais je l'ai légèrement modifiée car je ne suis pas fan des exceptions.
la source
Vous pouvez utiliser ce qui suit avec des objets, mais cela ne fonctionne malheureusement pas avec des chaînes.
Je l'utilise pour envelopper une variable de session dans une propriété (sur une page de base) .. donc mon utilisation réelle est (dans ma page de base):
Je suis capable de vérifier la valeur null dans la logique de la page:
la source
CType(Object, Nullable(Of Double))
fonctionne bien avec les chaînesIl n'y a aucun moyen de contourner cela. Nullable, ainsi que votre méthode, est contrainte d'utiliser uniquement des types valeur comme argument. String est un type de référence et est donc incompatible avec cette déclaration.
la source
la source
Il existe une solution générique (pour tout type). La convivialité est bonne, mais la mise en œuvre doit être améliorée: http://cleansharp.de/wordpress/2011/05/generischer-typeconverter/
Cela vous permet d'écrire du code très propre comme celui-ci:
et aussi:
la source
typeName.IndexOf
? Vraiment?) Et d'un comportement étrange (laTryConvert
fonction montrée ne gère même pas correctement les valeurs nulles).Voici quelque chose basé sur une réponse acceptée. J'ai supprimé le try / catch pour m'assurer que toutes les exceptions ne sont ni avalées ni traitées. Assurez-vous également que la variable de retour (dans la réponse acceptée) n'est jamais initialisée deux fois pour rien.
la source
Mon exemple pour les types anonymes:
la source
Une autre variante. Celui-là
NotSupportedException
si le type ne peut pas être converti à partir destring
. Par exemple, une structure personnalisée sans convertisseur de type.(T?)null
si l'analyse de la chaîne échoue. Pas besoin de vérifier la valeur nulle ou les espaces.la source
Ajoutons une autre solution similaire à la pile. Celui-ci analyse également les énumérations et il a l'air bien. Très sûr.
https://github.com/Pangamma/PangammaUtilities-CSharp/blob/master/PangammaUtilities/Extensions/ToNullableStringExtension.cs
la source
La réponse générique fournie par " Joel Coehoorn " est bonne.
Mais, c'est une autre façon sans utiliser ceux-ci
GetConverter...
ou lestry/catch
blocs ... (je ne suis pas sûr mais cela peut avoir de meilleures performances dans certains cas):L'utilisation est la suivante:
la source
TypeDescriptor.GetConverter
... codes. C'est juste une autre façon.