228 votes

Meilleure façon de convertir un objet en int

C'est probablement trivial, mais je ne vois pas de meilleure façon de procéder. J'ai un objet COM qui renvoie une variante qui devient un objet en C#. La seule façon de le transformer en un int est la suivante

int test = int.Parse(string.Format("{0}", myobject))

Existe-t-il un moyen plus propre de procéder ? Merci de votre compréhension.

450voto

Joel Coehoorn Points 190579

Plusieurs options s'offrent à vous :

  • (int) - Opérateur de casting. Fonctionne si l'objet l'est déjà un entier à un certain niveau de la hiérarchie d'héritage ou si une conversion implicite est définie.

  • int.Parse()/int.TryParse() - Pour convertir une chaîne de format inconnu.

  • int.ParseExact()/int.TryParseExact() - Pour convertir une chaîne de caractères dans un format spécifique

  • Convert.ToInt32() - Pour convertir un objet de type inconnu. Il utilisera une conversion explicite et implicite ou une implémentation IConvertible si elle est définie.

  • as int? - Notez le " ?". Les as ne concerne que les types de référence, et j'ai donc utilisé " ?" pour signifier un type de référence. Nullable<int> . Le " as L'opérateur " fonctionne comme suit Convert.To____() mais réfléchissez TryParse() plutôt que Parse() : il renvoie null plutôt que de lever une exception si la conversion échoue.

Parmi ceux-ci, je préférerais (int) si l'objet n'est en réalité qu'un nombre entier encadré. Sinon, utilisez Convert.ToInt32() dans ce cas.

Notez qu'il s'agit d'une général répondre : Je voudrais attirer l'attention sur la réponse de Darren Clark parce que je pense qu'elle aborde bien la question de l'accès à l'information. spécificités mais il est arrivé tardivement et n'a pas encore été élu. Il obtient mon vote pour "réponse acceptée", en tout cas, pour avoir également recommandé (int), pour avoir souligné que si cela échoue (int)(short) pourrait fonctionner à la place, et de vous recommander de vérifier votre débogueur pour connaître le type d'exécution réel.

0 votes

J'ai trouvé un point qui n'était pas vraiment une erreur mais qui simplifiait peut-être trop les choses pour que quelqu'un puisse le penser. J'ai supprimé cette phrase et ajouté un lien vers une documentation faisant autorité.

0 votes

La distribution directe fonctionnera-t-elle avec une conversion implicite ? J'avais l'impression qu'il ne s'agissait que d'un unboxing, pas d'autres conversions.

0 votes

Ce n'est pas vraiment une réponse, mais lisez ceci : blogs.msdn.com/ericlippert/archive/2009/03/19/

47voto

Darren Clark Points 1489

Les acteurs (int) myobject debe ne font que fonctionner.

Si vous obtenez une exception de cast invalide, c'est probablement parce que le type de variante n'est pas VT_I4. Je parie qu'une variante avec VT_I4 est convertie en un int boxé, VT_I2 en un short boxé, etc.

Lorsqu'on effectue un cast sur un type de valeur encadré, il n'est valable que pour le type encadré. Par exemple, si la variante retournée est en fait un VT_I2, alors (int) (short) myObject devrait fonctionner.

La façon la plus simple de le savoir est d'inspecter l'objet retourné et de regarder son type dans le débogueur. Assurez-vous également que dans l'assemblage interopérable, la valeur de retour est marquée par l'attribut MarshalAs(UnmanagedType.Struct)

46voto

Zahir Jacobs Points 475
Convert.ToInt32(myobject);

Cela permet de gérer le cas où mon objet est nul et de renvoyer 0, au lieu de lancer une exception.

1 votes

Essayez System.Convert.ToInt32(myobject).

9voto

Srikar Doddi Points 10611

Utilice Int32.TryParse comme suit.

  int test;
  bool result = Int32.TryParse(value, out test);
  if (result)
  {
     Console.WriteLine("Sucess");         
  }
  else
  {
     if (value == null) value = ""; 
     Console.WriteLine("Failure");
  }

0 votes

En fait, Parse appelle TryParse et lève une exception si TryParse renvoie une réponse fausse. TryParse ne gère donc pas l'exception car il n'en lance jamais.

0 votes

Techniquement, ils appellent tous deux la même méthode NumberToInt32, mais seul Parse lève des exceptions lorsque cela ne fonctionne pas.

0 votes

TryParse nécessite toujours la conversion de la variante en chaîne de caractères. AFAIK, le problème n'est pas de convertir une chaîne en un int, mais de convertir une variante qui est un int en un int réel.

3voto

J.W. Points 8135

Peut-être Convert.ToInt32 .

Attention à l'exception, dans les deux cas.

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