我很好奇如何在C#中获取盒装对象的类型。这是一个例子:
it
正如您所看到的,将捕获Exception子类的任何实例,现在您如何获取特定类型?
请注意,以上只是一个例子,我不会那样使用它所以请不要建议捕捉特定的例外。
这是另一个例子:
人物=新人(" John"); 对象obj = person; //框
现在,您如何从result
获取try{
...
}catch(Exception ex){
//get the specific type of exception
}
类型?
答案 0 :(得分:2)
你可以这样做:
答:使用GetType()
Type type = ex.GetType()
B:使用is
。
if (ex is FileNotFoundException)
{
}
(请注意,如果ex
来自FileNoteFoundException
,则上述测试也会返回true。)
C:如果您需要有关该类型的其他信息,可以使用反射。
ex.GetType().GetProperty("PropName"); // Etc.
答案 1 :(得分:2)
添加到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
}
确保异常类型的顺序从更具体(子)到不太具体(父)。
这个答案当然只适用于try ... catch场景。否则,我更喜欢
is
关键字。
答案 2 :(得分:1)
如何定义变量的类型:
if( err is SomeException)
{
}
或(在某些情况下,如果你需要做一些不能表达的更复杂的类型层次结构的东西)
if( err.GetType().IsAssignableFrom(typeof(SomeException)))
{ }
Boxing是将值类型转换为类型对象或由此值类型实现的任何接口类型的过程。当CLR选中一个值类型时,它将值包装在System.Object中并将其存储在托管堆上。取消装箱从对象中提取值类型。拳击是隐含的;拆箱是明确的。装箱和拆箱的概念是类型系统的C#统一视图的基础,其中任何类型的值都可以被视为对象。
将派生类转换为基类时,会将其称为casting