确定C#中装箱对象的类型

本文关键字:对象 类型 确定 | 更新日期: 2023-09-27 18:19:29

我很好奇如何在C#中获得装箱对象的类型。这里有一个例子:

try{
    ...
}catch(Exception ex){
    //get the specific type of exception
}

正如你所看到的,Exception子类的任何实例都会被捕获,现在你如何获得特定的类型?

请注意,上面只是一个例子,我不会那样使用它,所以请不要建议捕捉特定的异常。

下面是另一个例子:

人员=新人("John");object obj=人//盒式

现在,如何从obj获得类型Person

确定C#中装箱对象的类型

实现这一点的方法:

A: 使用GetType()

Type type = ex.GetType()

B: 使用is

if (ex is FileNotFoundException)
{
}

(注意,如果ex是从FileNoteFoundException导出的,则上述测试也返回true。)

C: 如果需要有关类型的其他信息,可以使用反射。

ex.GetType().GetProperty("PropName"); // Etc.

除了Jonathan的答案之外,您还可以有多个catch块,如下所示:

try
{
}
catch(ExceptionType1 ex)
{
      //Action for ExceptionType1 exception
}
catch(ExceptionType2 ex)
{
      //Action for ExceptionType2 exception
}
...
catch(Exception ex)
{
      //Action for other types of exception
}

只需确保异常类型的顺序是从更特定的(子)到不太特定的(父)。

此答案仅适用于尝试。。。当然,捕捉场景。否则,我更喜欢

is

关键字。

如何定义变量的类型:

if( err is SomeException)
{
}

或者(在某些情况下,如果你需要做一些无法用is表示的更复杂的类型层次结构的东西)

if( err.GetType().IsAssignableFrom(typeof(SomeException)))
{ }    

装箱是将值类型转换为类型对象或由该值类型实现的任何接口类型的过程。CLR对值类型进行装箱时,会将该值封装在System.Object中,并将其存储在托管堆中。取消装箱将从对象中提取值类型。拳击是含蓄的;开箱是明确的。装箱和取消装箱的概念是类型系统的C#统一视图的基础,在该视图中,任何类型的值都可以被视为对象。

当您将派生类转换为基类时,它被称为casting