将对象强制转换为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);
这将处理myobject
为null
并返回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 }