EDIT: Come ho capito il problema, il problema è puramente IDE; VS non ti piace che il trattamento dell'eccezione generata dall'invocazione dello MethodInfo
come non risolto, quando chiaramente non lo è. Puoi leggere come risolvere questo problema qui: Why is TargetInvocationException treated as uncaught by the IDE? Sembra un bug/di progettazione; ma in un modo o nell'altro, in questa risposta sono elencati soluzioni alternative decenti.
come la vedo io, si dispone di un paio di opzioni:
È possibile utilizzare MethodInfo.Invoke
, prendere il TargetInvocationException
e controllare la sua proprietà InnerException
. Dovrai risolvere i problemi relativi all'IDE come menzionato in quella risposta.
È possibile creare uno Delegate
appropriato dal MethodInfo
e richiamarlo. Con questa tecnica, l'eccezione generata non verrà spostata. Inoltre, questo approccio fa sembra giocare bene con il debugger; Non ricevo alcun pop-up "Eccezione non rilevata".
Ecco un esempio che mette in evidenza entrambi gli approcci:
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();
}
}
soluzione a breve e semplice! –