【发布时间】:2015-01-30 09:54:51
【问题描述】:
我正在研究一种使用反射来调用另一个方法的方法。然而,那个“其他方法”可以抛出一个异常,我想用它的原始堆栈信息和InnerException传播那个异常。那只是因为使用反射的方法不应该处理异常,调用者应该。
这是代码的简化版本:
public static bool Test() {
try {
return (bool) typeof(Program).GetMethod("OtherMethod").Invoke(null, null);
} catch(TargetInvocationException ex) {
ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
}
}
public static bool OtherMethod() {
throw new InvalidOperationException();
}
该代码显然无法编译,因为Test 方法(根据编译器)并不总是返回值。
我可以在ExceptionDispatchInfo.Capture 之后添加return false,但我想知道是否有更好的方法来实现同样的目标。不用写多余的return false。
我知道这是一个挑剔的问题,但我不禁想知道。另外,冗余代码让我很痒:P
【问题讨论】:
-
您在这里没有太多选择。编译器无法推断出
Throw()实际上会抛出,所以从它的角度来看,有些代码路径确实不返回值。添加return语句似乎是唯一的解决方案。 -
这有多简单?因为这段代码可能只是
throw ex.InnerException;。简化似乎损害了这个问题。
标签: c# reflection