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

Ste*_*eve 164 c# interop

这可能是微不足道的,但我想不出更好的方法.我有一个COM对象,它返回一个变体,它变成了C#中的一个对象.我能把它变成int的唯一方法是

int test = int.Parse(string.Format("{0}", myobject))
Run Code Online (Sandbox Code Playgroud)

有更清洁的方法吗?谢谢

Joe*_*orn 340

你有几个选择:

  • (int) - 演员.如果对象已经是继承层次结构中某个级别的整数,或者是否定义了隐式转换,则可以正常工作.

  • int.Parse()/int.TryParse() - 用于从未知格式的字符串转换.

  • int.ParseExact()/int.TryParseExact() - 用于转换特定格式的字符串

  • Convert.ToInt32() - 用于转换未知类型的对象.如果定义了任何实现,它将使用显式和隐式转换或IConvertible实现.

  • as int? - 注意"?".该as操作仅作参考类型,所以我用"?" 表示一个Nullable<int>." as"运算符的作用类似于Convert.To____(),但是思考TryParse()而不是Parse():null如果转换失败,它返回而不是抛出异常.

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

请注意,这是一个非常普遍的答案:我想对Darren Clark的回应给予一些关注,因为我认为它在这里解决了具体细节方面做得很好,但是来得太晚并且还没有投票.无论如何,他得到了对"已接受的答案"的投票,因为它也推荐(int),指出如果它失败(int)(short)可能会起作用,并建议你检查你的调试器以找出实际的运行时类型.


Dar*_*ark 38

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

如果这给你一个无效的强制转换异常,那么可能是因为变量类型不是VT_I4.我敢打赌,将带有VT_I4的变体转换为盒装int,将VT_I2转换为盒装短片等.

对盒装值类型进行强制转换时,仅将其强制转换为盒装类型.例如,如果返回的变量实际上是VT_I2那么(int)(短)myObject应该工作.

最简单的方法是检查返回的对象并在调试器中查看其类型.还要确保在interop程序集中具有标记为MarshalAs(UnmanagedType.Struct)的返回值


Zah*_*r J 28

Convert.ToInt(myobject);
Run Code Online (Sandbox Code Playgroud)

这将处理myobjectis null和return 的情况0,而不是抛出异常.

  • 尝试 System.Convert.ToInt32(myobject)。 (2认同)

Sri*_*ddi 8

使用Int32.TryParse方法如下.

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