Лучшего способа для приведения объекта к типу int
Это, наверное, тривиально, но я не могу придумать лучшего способа сделать это. У меня есть COM-объект, который возвращает вариант, который становится объектом в C#. Единственный способ, которым я могу получить это в int-это
int test = int.Parse(string.Format("{0}", myobject))
есть ли более чистый способ сделать это? Спасибо
8 ответов:
у вас есть несколько вариантов:
(int)
- оператор приведения. Если объект уже целое число на некотором уровне иерархии наследования или если определено неявное преобразование.
int.Parse()/int.TryParse()
- для преобразования из строки неизвестного формата.
int.ParseExact()/int.TryParseExact()
- для преобразования из строки в определенном формате
Convert.ToInt32()
- для преобразование объекта неизвестного типа. Он будет использовать явное и неявное преобразование или IConvertible реализацию, если таковые определены.
as int?
- обратите внимание на "?". Элементas
оператор только для ссылочных типов, и поэтому я использовал "?- чтобы обозначитьNullable<int>
. В "as
" оператором работает какConvert.To____()
, но думаюTryParse()
, а неParse()
: он возвращаетnull
вместо того, чтобы выдавать исключение, если преобразование не удается.Of эти, я бы предпочел
(int)
Если объект действительно является просто целым числом в коробке. В противном случае используйтеConvert.ToInt32()
в этом случае.обратите внимание, что это очень общие ответ: я хочу обратить некоторое внимание на ответ Даррена Кларка, потому что я думаю, что он хорошо справляется с особенности здесь, но пришел поздно и еще не был проголосован. Он получает мой голос за "принятый ответ", во всяком случае, за рекомендацию (int), за указание что если это не удастся
(int)(short)
может работать вместо этого, и для рекомендации вам проверить отладчик, чтобы узнать фактический тип среды выполнения.
литой (int) myobjectдолжны просто работать.
Если это дает вам недопустимое исключение приведения, то это, вероятно, потому, что тип варианта не VT_I4. Моя ставка заключается в том, что вариант с VT_I4 преобразуется в коробку int, VT_I2 в коробку short и т. д.
при выполнении приведения к коробчатому типу значения допустимо только привести его к типу в коробке. Например, если возвращаемый вариант на самом деле является VT_I2, то (int) (short) myObject должны работать.
самый простой способ узнать-это проверить возвращаемый объект и взглянуть на его тип в отладчике. Также убедитесь, что в сборке взаимодействия у вас есть возвращаемое значение, отмеченное MarshalAs(UnmanagedType.Структуры)
Convert.ToInt(myobject);
это будет обрабатывать случай, когда
myobject
иnull
и возврат0
, вместо того, чтобы бросать исключение.
использовать
Int32.TryParse
следующим образом.int test; bool result = Int32.TryParse(value, out test); if (result) { Console.WriteLine("Sucess"); } else { if (value == null) value = ""; Console.WriteLine("Failure"); }
я перечисляю разницу в каждом из способов литья. Какой конкретный вид литья и ручки нет?
// object to int // does not handle null // does not handle NAN ("102art54") // convert value to integar int intObj = (int)obj; // handles only null or number int? nullableIntObj = (int?)obj; // null Nullable<int> nullableIntObj1 = (Nullable<int>)obj; // null // best way for casting from object to nullable int // handles null // handles other datatypes gives null("sadfsdf") // result null int? nullableIntObj2 = obj as int?; // string to int // does not handle null( throws exception) // does not string NAN ("102art54") (throws exception) // converts string to int ("26236") // accepts string value int iVal3 = int.Parse("10120"); // throws exception value cannot be null; // handles null converts null to 0 // does not handle NAN ("102art54") (throws exception) // converts obj to int ("26236") int val4 = Convert.ToInt32("10120"); // handle null converts null to 0 // handle NAN ("101art54") converts null to 0 // convert string to int ("26236") int number; bool result = int.TryParse(value, out number); if (result) { // converted value } else { // number o/p = 0 }
там же TryParse.
от MSDN:
private static void TryToParse(string value) { int number; bool result = Int32.TryParse(value, out number); if (result) { Console.WriteLine("Converted '{0}' to {1}.", value, number); } else { if (value == null) value = ""; Console.WriteLine("Attempted conversion of '{0}' failed.", value); } }
может быть преобразовать.ToInt32.
следите за исключением, в обоих случаях.