Лучший способ приведения объекта к 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
    }