Лучший способ привести объект к int

Это, наверное, тривиально, но я не могу придумать лучшего способа сделать это. У меня есть COM-объект, который возвращает вариант, который становится объектом в C#. Единственный способ получить это в int -

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

есть ли более чистый способ сделать это? Спасибо

8 ответов


у вас есть несколько вариантов:

  • (int) - оператор Cast. Если объект уже целое число на некотором уровне иерархии наследования или если определено неявное преобразование.

  • int.Parse()/int.TryParse() - для преобразования из строки неизвестного формата.

  • int.ParseExact()/int.TryParseExact() - для преобразования из строки в определенном формате

  • Convert.ToInt32() - для преобразование объекта неизвестного типа. Он будет использовать явное и неявное преобразование или реализацию IConvertible, если таковые определены.

  • as int? - обратите внимание на "?". The as оператор только для ссылочных типов, и поэтому я использовал "?- чтобы обозначить Nullable<int>. В "as" оператором работает как Convert.To____(), но думаю TryParse(), а не Parse(): он возвращает null вместо того, чтобы бросать исключение, если преобразование завершается неудачей.

Of эти, я бы предпочел (int) Если объект действительно является просто целым числом в коробке. В противном случае используйте Convert.ToInt32() в этом случае.

обратите внимание, что это очень общие ответ: я хочу обратить внимание на ответ Даррена Кларка, потому что я думаю, что он хорошо справляется с особенности здесь, но пришел поздно и еще не проголосовал. Он получает мой голос за "принятый ответ", во всяком случае, за рекомендацию (int), за указание что если это не удастся (int)(short) может работать вместо этого, и для рекомендации вам проверить отладчик, чтобы узнать фактический тип выполнения.


литой (int) myobject должны просто работать.

Если это дает вам недопустимое исключение приведения, то это, вероятно, потому, что тип варианта не VT_I4. Моя ставка заключается в том, что вариант с VT_I4 преобразуется в boxed int, VT_I2 в boxed short и т. д.

при выполнении приведения по типу коробчатого значения допустимо только привести его к типу коробчатого. Например, если возвращаемый вариант на самом деле является VT_I2, то (int) (короткий) объект MyObject должны работать.

самый простой способ узнать-проверить возвращаемый объект и посмотреть его тип в отладчике. Также убедитесь, что в сборке взаимодействия возвращаемое значение помечено MarshalAs(UnmanagedType.Struct)


Convert.ToInt(myobject);

это будет обрабатывать случай, когда myobject is 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);
      }
   }

var intTried = Convert.ChangeType(myObject, typeof(int)) as int?;

может быть преобразовать.ToInt32.

следите за исключением, в обоих случаях.