Лучшего способа для приведения объекта к типу int


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

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

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

8 134

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);
      }
   }
var intTried = Convert.ChangeType(myObject, typeof(int)) as int?;

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

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