EDIT: As I understand your issue, the problem is purely an IDE one; you don't like VS treating the exception thrown by the invocation of the MethodInfo
as uncaught, when it clearly isn't. You can read about how to resolve this problem here: Why is TargetInvocationException treated as uncaught by the IDE? It appears to be a bug / by design; but one way or another, decent workarounds are listed in that answer.
As I see it, you have a couple of options:
You can use MethodInfo.Invoke
, catch the TargetInvocationException
and inspect its InnerException
property. You will have to workaround the IDE issues as mentioned in that answer.
You can create an appropriate Delegate
out of the MethodInfo
and invoke that instead. With this technique, the thrown exception will not be wrapped. Additionally, this approach does seem to play nicely with the debugger; I don't get any "Uncaught exception" pop-ups.
Here's an example that highlights both approaches:
class Program
{
static void Main()
{
DelegateApproach();
MethodInfoApproach();
}
static void DelegateApproach()
{
try
{
Action action = (Action)Delegate.CreateDelegate
(typeof(Action), GetMethodInfo());
action();
}
catch (NotImplementedException nie)
{
}
}
static void MethodInfoApproach()
{
try
{
GetMethodInfo().Invoke(null, new object[0]);
}
catch (TargetInvocationException tie)
{
if (tie.InnerException is NotImplementedException)
{
}
}
}
static MethodInfo GetMethodInfo()
{
return typeof(Program)
.GetMethod("TestMethod", BindingFlags.NonPublic | BindingFlags.Static);
}
static void TestMethod()
{
throw new NotImplementedException();
}
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…