这可能是微不足道的,但我想不出更好的方法.我有一个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,而不是抛出异常.
使用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)