Лучший способ приведения объекта к int
Это, вероятно, тривиально, но я не могу придумать лучшего способа сделать это. У меня есть COM-объект, который возвращает вариант, который становится объектом в С#. Единственный способ получить это в int -
int test = int.Parse(string.Format("{0}", myobject))
Есть ли более чистый способ сделать это? Благодаря
Ответы
Ответ 1
У вас есть несколько вариантов:
-
(int)
— Оператор ротации. Работает, если объект уже является целым числом на некотором уровне иерархии наследования или если определено неявное преобразование.
-
int.Parse()/int.TryParse()
— Для преобразования из строки неизвестного формата.
-
int.ParseExact()/int.TryParseExact()
— Для преобразования из строки в определенном формате
-
Convert.ToInt32()
— Для преобразования объекта неизвестного типа. Он будет использовать явное и неявное преобразование или реализацию IConvertible, если они определены.
-
as int?
— Обратите внимание "?". Оператор as
предназначен только для ссылочных типов, поэтому я использовал "?" для обозначения a Nullable<int>
. Оператор as
работает как Convert.To____()
, но думаю TryParse()
, а не Parse()
: он возвращает null
, а не бросает исключение, если преобразование завершается неудачно.
Из них я бы предпочел (int)
, если объект действительно представляет собой просто целое число в штучной упаковке. В противном случае используйте Convert.ToInt32()
в этом случае.
Обратите внимание, что это очень общий ответ: я хочу обратить внимание на ответ Даррена Кларка, потому что я думаю, что он хорошо справляется с особенностями здесь, но пришел поздно и еще не проголосовал. В любом случае, он получает мой голос за "принятый ответ" за рекомендацию (int), указав, что если он терпит неудачу, (int)(short)
может работать вместо этого, а также для того, чтобы рекомендовать вам проверить ваш отладчик на предмет фактического типа времени выполнения.
Ответ 2
Листинг (int) myobject должен работать.
Если это дает вам недопустимое исключение листинга, то это, вероятно, потому, что тип варианта не VT_I4. Моя ставка заключается в том, что вариант с VT_I4 преобразуется в коробку int, VT_I2 в коробочный короткий и т.д.
При выполнении броска по типу с коротким значением допустимо только применить его к типу в коробке.
Например, если возвращаемый вариант на самом деле является VT_I2, тогда (int) (короткий) myObject должен работать.
Самый простой способ узнать - проверить возвращаемый объект и посмотреть его тип в отладчике. Также убедитесь, что в сборке interop у вас есть возвращаемое значение, помеченное маршалами (UnmanagedType.Struct)
Ответ 3
Convert.ToInt(myobject);
Это будет обрабатывать случай, когда myobject
является null
и возвращает 0
вместо того, чтобы бросать исключение.
Ответ 4
Используйте Int32.TryParse
следующим образом.
int test;
bool result = Int32.TryParse(value, out test);
if (result)
{
Console.WriteLine("Sucess");
}
else
{
if (value == null) value = "";
Console.WriteLine("Failure");
}
Ответ 5
Возможно Convert.ToInt32.
Следите за исключением, в обоих случаях.
Ответ 6
Там также 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);
}
}
Ответ 7
var intTried = Convert.ChangeType(myObject, typeof(int)) as int?;
Ответ 8
Я перечисляю разницу в каждом из способов кастинга. Какой особый тип ручек для литья и нет?
// 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
}