将对象强制转换为int的更好方法

这可能是微不足道的,但我想不出一个更好的方法来做到这一点。 我有一个COM对象,返回一个变体,成为在C#中的对象。 唯一的办法,我可以得到这个int是

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

有没有更干净的方法来做到这一点? 谢谢

你有几个select:

  • (int) – 演员。 如果对象已经是inheritance层次结构中某个级别的整数,或者存在已定义的隐式转换,则工作。

  • int.Parse()/int.TryParse() – 用于从未知格式的string转换。

  • int.ParseExact()/int.TryParseExact() – 用于从特定格式的string中进行转换

  • Convert.ToInt32() – 用于转换未知types的对象。 如果有定义,它将使用显式和隐式转换或IConvertible实现。

  • as int? – 注意“?”。 as运算符仅用于引用types,所以我使用“?” 表示一个Nullable<int> 。 “ as ”操作符就像Convert.To____() ,但是想象一下TryParse()而不是Parse() :如果转换失败,返回null而不是抛出exception。

其中,我更喜欢(int)如果对象真的只是一个盒装整数。 否则,在这种情况下使用Convert.ToInt32()

请注意,这是一个非常普遍的答案:我想把注意力放在达伦·克拉克(Darren Clark)的回答上,因为我认为在这里处理具体问题做得很好,但是迟到了,还没有被投票。 他得到了我的“接受的答案”的投票,无论如何也推荐(int),指出如果失败(int)(short)可能会起作用,build议您检查debugging器以找出实际的运行时types。

cast (int)myobject 应该可以工作。

如果这给你一个无效的转换exception,那么可能是因为变体types不是VT_I4。 我敢打赌,一个VT_I4的变体被转换成一个盒装的int,VT_I2变成一个盒装的短小等等。

对盒装值types进行强制转换时,只能将其转换为装箱types。 例如,如果返回的变体实际上是VT_I2,那么(int)(short)myObject应该可以工作。

最容易find的方法是检查返回的对象,并在debugging器中查看其types。 还要确保在interop程序集中你有用MarshalAs(UnmanagedType.Struct)标记的返回值

 Convert.ToInt(myobject); 

这将处理myobjectnull并返回0 ,而不是抛出exception。

使用Int32.TryParse如下。

  int test; bool result = Int32.TryParse(value, out test); if (result) { Console.WriteLine("Sucess"); } else { if (value == null) value = ""; Console.WriteLine("Failure"); } 

也许Convert.ToInt32 。

注意在这两种情况下的例外情况。

还有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?; 

我列出了每种铸造方法的差异。 什么types的铸造处理,而不是?

  // 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 }