2009-04-13 39 views
122

这可能很简单,但我想不出一个更好的方法来做到这一点。我有一个COM对象返回一个变体,成为C#中的一个对象。我可以把它变成一个整数的唯一方法是将对象投射到int的更好方法

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

有没有更简单的方法来做到这一点?谢谢

回答

266

您有几种选择:

  • (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()

请注意,这是一个非常一般回答:我想抛出一些注意达伦 - 克拉克的回应,因为我觉得它做得很好解决细节这里,但回来晚了,并没有投票,好吧。他得到我的“接受答案”的投票,无论如何也推荐(int),指出如果它失败(int)(short)可能会起作用,建议您检查调试器以找出实际的运行时类型。

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"); 
    } 
+0

实际上,如果TryParse返回false,则Parse会调用TryParse并引发异常。所以TryParse不处理异常,因为它从不抛出一个异常。 – Samuel 2009-04-13 20:20:20

+0

从技术上讲,它们都调用同样的方法NumberToInt32,但只有Parse在不工作时抛出异常。 – Samuel 2009-04-13 20:22:50

+0

TryParse仍然需要将变体转换为字符串。 AFAIK问题不是从字符串转换为int,而是从int到int的变体。 – 2009-04-13 20:44:32

17
Convert.ToInt(myobject); 

这将处理的情况下myobjectnull并返回0,而不是抛出异常。

2

还有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); 
     } 
    } 
28

演员表(int)myobject应该只是工作。

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

当对盒装值类型进行强制转换时,只能将其转换为装盒类型。例如,如果返回的变体实际上是VT_I2,那么(int)(简写)myObject应该起作用。

找出最简单的方法是检查返回的对象,并在调试器中查看它的类型。另外,还要确保在互操作程序集必须标明的MarshalAs(UnmanagedType.Struct)的返回值

2
var intTried = Convert.ChangeType(myObject, typeof(int)) as int?; 
2

我列出每个铸造方法的差异。什么类型的铸造处理,而不是?

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