C# 取消装箱对象,该对象包含已知可分配给整型变量的值
如果我有一个C# 取消装箱对象,该对象包含已知可分配给整型变量的值,c#,C#,如果我有一个对象实例,并且我知道它实际上是一个装箱整数,那么我可以简单地将它转换回int,如下所示: object o = GetSomethingByName("foo"); int i = (int)o; 然而,我并不知道这个值是整数。我只知道它可以分配给一个整数。例如,它可能是一个字节,在这种情况下,上面的代码将抛出InvalidCastException。相反,我必须这样做: object o = GetSomethingByName("foo"); int i = (int)(b
对象
实例,并且我知道它实际上是一个装箱整数,那么我可以简单地将它转换回int,如下所示:
object o = GetSomethingByName("foo");
int i = (int)o;
然而,我并不知道这个值是整数。我只知道它可以分配给一个整数。例如,它可能是一个字节
,在这种情况下,上面的代码将抛出InvalidCastException
。相反,我必须这样做:
object o = GetSomethingByName("foo");
int i = (int)(byte)o;
该值也可以是
short
,或者可以分配给int
的其他值。我如何概括我的代码来处理所有这些情况(而不单独处理每种可能性)?简单地写下这个问题让我记住有一个转换
类。这似乎有效:
int i = Convert.ToInt32(o);
edit:但不幸的是,它也会进行我实际上不想要的类型转换,比如解析字符串。有趣的是,看看
Convert.ToInt32
如何完成转换:
public static int ToInt32(object value)
{
return value == null? 0: ((IConvertible)value).ToInt32(null);
}
诀窍是将对象强制转换为
IConvertible
,正如我所建议的:)不过您不需要强制转换为int;该方法已声明为返回int。谢谢,我删除了不必要的强制转换。@Lasse:这些对象实际上是由一个API的互操作层生成的,该API使用COM变量。API两侧现有的本机代码可以容忍不同类型的整数,因此我尝试匹配这种行为。这些变体还存储在字段中已有的文件中,因此无法轻松更改。