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

时间:2009-04-13 20:02:50

标签: c# interop

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

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

有更清洁的方法吗?感谢

11 个答案:

答案 0 :(得分:317)

您有几种选择:

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

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

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

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

  • as int? - 请注意“?”。 as运算符仅用于引用类型,因此我使用“?”表示Nullable<int>。 “as”运算符的作用类似于Convert.To____(),但请考虑TryParse()而不是Parse():它会返回null,而不是在转换失败时抛出异常。< / p>

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

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

答案 1 :(得分:35)

演员(int)myobject 正常工作。

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

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

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

答案 2 :(得分:24)

Convert.ToInt(myobject);

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

答案 3 :(得分: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");
  }

答案 4 :(得分:3)

我列出了每种施法方式的不同之处。什么特定类型的铸件处理它并没有?

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

答案 5 :(得分: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);
      }
   }

答案 6 :(得分:2)

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

答案 7 :(得分:1)

也许Convert.ToInt32

在两种情况下都要注意例外。

答案 8 :(得分:1)

很奇怪,但是对于强制转换和转换,公认的答案似乎是错误的,这意味着从我的测试和阅读文档中也不应考虑隐式或显式运算符。

因此,如果我有一个类型为object的变量,并且“装箱”类定义了一些隐式运算符,则它们将无法工作。

相反,还有一种简单的方法,但真正的性能成本计算是动态转换。

(int)(动态)myObject。

您可以在VS的“交互”窗口中尝试。

public class Test
{
  public static implicit operator int(Test v)
  {
    return 12;
  }
}

(int)(object)new Test() //this will fail
Convert.ToInt32((object)new Test()) //this will fail
(int)(dynamic)(object)new Test() //this will pass

答案 9 :(得分:0)

int i = myObject.myField.CastTo<int>();

答案 10 :(得分:0)

您可以先将 object 转换为 string,然后将 string 转换为 int; 例如:

string str_myobject = myobject.ToString();
int int_myobject = int.Parse(str_myobject);

这对我有用。