65 votes

C# Meilleur moyen de convertir une dynamique en chaîne

Ce qui suit récupère un champ d'une DataTable et le convertit en chaîne de caractères. Existe-t-il un moyen plus propre de convertir une dynamique en chaîne de caractères ?

dynamic value = dataTable.Rows[i].Field<dynamic>(columnName);
value = (value == null) ? null : value.ToString();

119voto

Marc Gravell Points 482669
string value = Convert.ToString(dataTable.Rows[i][columnName]);

le formatage standard s'appliquera, sans qu'il soit nécessaire de recourir à des éléments tels que les génériques, les méthodes d'extension ou les dynamiques.

24voto

Mawardy Points 1036

Tout d'abord, en tant que Marc mentionné dans sa réponse " le formatage standard s'appliquera, sans qu'il soit nécessaire de recourir à des éléments tels que les génériques, les méthodes d'extension ou les fonctions dynamiques. " donc, dans votre cas, vous n'avez pas besoin d'utiliser la fonction dynamic vous pouvez simplement convertir directement en chaîne, mais pour ce qui est de la conversion de dynamique en chaîne, j'ai deux possibilités :

Premier moyen

string x = Convert.ToString(value) // value is a dynamic object

pros : c'est un bon moyen de conversion si vous n'êtes pas sûr que le type de données compilé supporte le casting en chaîne de caractères ou si c'est codé en dur. comme int par exemple,

contre : de cette façon peut causer des erreurs si vous essayez de faire Convert.ToString(value) // value is a dynamic object à l'intérieur d'un Méthode d'extension quand je le fais, cela me donne cette erreur : "Les méthodes d'extension ne peuvent pas être dynamiquement. Considérez moulage les arguments dynamiques ou l'appel de la méthode d'extension sans la syntaxe de la méthode d'extension" .

donc si vous utilisez par exemple Asp.Net Core HttpContext.Session.SetString() et vous mettez Convert.ToString(value) // value is dynamic object en tant que conversion en ligne dans les arguments, vous obtiendrez l'erreur dans l'en-tête de l'article. contre Pour résoudre ce problème, vous pouvez affecter une variable en dehors des arguments de la fonction à la fonction Covert.ToString(value) résultat puis envoyer la variable aux arguments de la fonction d'extension :

dynamic value = 10;
HttpContext.Session.SetString("key",Convert.ToString(value));  <-- error

résolution :

dynamic value = 10;
string x = Convert.ToString(value);
HttpContext.Session.SetString("key",x);  // works fine

ou utiliser la deuxième méthode (coulée), s'assurer que le type de données compilé supporte le casting en string

HttpContext.Session.SetString("key",(string)value);

Deuxième voie
moulage dynamic a string si la version compilée type de données le soutient

string x = (string)value;  //value is dynamic object

pros : -c'est utile si vous voulez faire une conversion en ligne à l'intérieur d'un fichier de type Méthode d'extension arguments -également utile si vous voulez vous assurer que le type de données compilé supporte le moulage en chaîne de caractères et générer une exception basée sur cette

contre : Cette méthode ne fonctionne pas pour tous les types de données. Si vous souhaitez une méthode de conversion plus générique, la première méthode est recommandée.


comme mentionné ici dans Docs MS "Le type dynamique permet aux opérations dans lesquelles il intervient de contourner la vérification de type en temps de compilation . Au lieu de cela, ces opérations sont résolu au moment de l'exécution. "

Ainsi, le dynamic Le type de données de la variable est compilé au moment de l'exécution et prend un type différent de celui de la variable dynamic et vous pouvez utiliser moulage si l'objet interprété le supporte ou utiliser Convert.ToString() pour une conversion de type plus générique.

PS : si vous convertissez vers un type de données autre qu'une chaîne de caractères, vous risquez de perdre des données, comme lors de la conversion d'un flottant en int, soyez-en conscient.

1voto

Paul Hurt Points 11

J'ai un cas où la dynamique devrait être une chaîne, mais dans un cas d'erreur, c'est un nombre (le code que j'appelle et que je ne peux pas modifier fait cela).

Dans mon cas, c'est le cas :

string x = value as string;
if (x == null)
{
   // error condition
} else {
   //use x here
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X