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

确定C#中装箱对象的类型?,c#,C#,我很好奇如何在C#中获得装箱对象的类型。下面是一个例子: try{ ... }catch(Exception ex){ //get the specific type of exception } 正如您所看到的,Exception子类的任何实例都将被捕获,现在如何获取特定类型 请注意,上面只是一个示例,我不会这样使用它,所以请不要建议捕获特定的异常 下面是另一个例子: 个人=新人(“约翰”); 对象obj=人//盒子 现在,如何从obj中获取类型Person?方法: 答:使用

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

try{
    ...
}catch(Exception ex){
    //get the specific type of exception
}
正如您所看到的,Exception子类的任何实例都将被捕获,现在如何获取特定类型

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

下面是另一个例子:

个人=新人(“约翰”); 对象obj=人//盒子

现在,如何从
obj
中获取类型
Person

方法:

答:使用
GetType()

B:使用

if (ex is FileNotFoundException)
{
}
(请注意,如果
ex
是从
FileNoteFoundException
派生的,则上述测试也会返回true)

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

ex.GetType().GetProperty("PropName"); // Etc.
实现这一点的方法:

答:使用
GetType()

B:使用

if (ex is FileNotFoundException)
{
}
(请注意,如果
ex
是从
FileNoteFoundException
派生的,则上述测试也会返回true)

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

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

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

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

关键字。

除了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表示)

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


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

如何定义变量的类型:

if( err is SomeException)
{
}
或者(在某些情况下,如果您需要执行一些更复杂的类型层次结构,而这些类型层次结构无法用is表示)

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


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

我更喜欢反射,但是如何转换呢?Thanks@dpp:取决于您需要的信息。如果您只想获取类型,请使用
GetType()
。在我的示例中,当我使用GetType时,是否要获取
FileNotFoundException
而不是
Exception
?我用
Exception ex=newfilenotfoundexception()在LINQPad中做了一个测试;WriteLine(例如GetType())。输出为FileNotFoundException。很抱歉,我在这台计算机中没有编译器,无法测试它。我更喜欢反射,但如何?Thanks@dpp:取决于您需要的信息。如果您只想获取类型,请使用
GetType()
。在我的示例中,当我使用GetType时,是否要获取
FileNotFoundException
而不是
Exception
?我用
Exception ex=newfilenotfoundexception()在LINQPad中做了一个测试;WriteLine(例如GetType())。输出为FileNotFoundException。很抱歉,我在这台计算机中没有编译器,无法测试它。@不幸运的是,我认为很明显我与将被捕获的对象有关。在catch块中,我想确定
ex
的具体类型,因为它是装箱的。@unlucky我认为很明显,我属于将被捕获的对象。在catch块中,我想确定
ex的特定类型,因为它已装箱。感谢您的帮助,但我的实际问题是确定ex的特定类型,而不是如何捕获不同的异常,我在帖子中提到了这一点。感谢您的帮助,但我的实际问题是确定特定类型的前的类型,而不是如何捕获不同的异常,我在帖子中提到了这一点。