Zachowywanie wyjątków od metod wywoływanych dynamicznie

Związane zZwiązane z

Chcę dynamicznie wywołać aMethodInfo obiekt i wszelkie wyjątki, które są wyrzucane z wnętrza, przechodzą na zewnątrz, tak jakby były wywoływane normalnie.

Wydaje mi się, że mam dwie opcje. Są opisane poniżej.

opcja 1 utrzymuje typ wyjątku rzucanego przezMyStaticFunction, aleStackTrace jest zrujnowany z powoduthrow.

Opcja 2 utrzymujeStackTrace wyjątku, ale typ wyjątku jest zawszeTargetInvocationException. Mogę wyciągnąćInnerException i jego typ, ale to znaczy, że nie mogę napisać tego na przykład:

try { DoDynamicCall(); }
catch (MySpecialException e) { /* special handling */ }

Opcja 1:

void DoDynamicCall()
{
    MethodInfo method = /*referencing MyClass method void MyStaticFunction(int x)*/;
    try
    {
        method.Invoke(null, new object[] { 5 });
    }
    catch (TargetInvocationException e)
    {
        throw e.InnerException;
    }
}

Opcja 2:

void DoDynamicCall()
{
    MethodInfo method = /*referencing MyClass method void MyStaticFunction(int x)*/;
    method.Invoke(null, new object[] { 5 });
}

Czego naprawdę chcę jest dla dzwoniących doDoDynamicCall otrzymywać wyjątki, jak gdyby to nazywali:

void DoDynamicCall()
{
    MyClass.MyStaticFunction(5);
}

Czy istnieje sposób na czerpanie korzyści z obuopcja 1 iOpcja 2?

Edytować:

Theopcja, którą chciałbym mieć (wymyślił specjalne nowe słowo kluczowe C #rethrow na miejscu):

void DoDynamicCall()
{
    MethodInfo method = /*referencing MyClass method void MyStaticFunction(int x)*/;
    try
    {
        method.Invoke(null, new object[] { 5 });
    }
    catch (TargetInvocationException e)
    {
        //Magic "rethrow" keyword passes this exception
        //onward unchanged, rather than "throw" which
        //modifies the StackTrace, among other things
        rethrow e.InnerException;
    }
}

Pozwoliłoby to również wyeliminować tego dziwaka, ponieważ można go użyćrethrow e; zamiast:

try { ... }
catch (Exception e)
{
    if (...)
        throw;
}

Ogólnie rzecz biorąc, byłby to sposób na oddzieleniethrow; z wymogu „Muszę być bezpośrednio w bloku połowów”.

questionAnswers(4)

yourAnswerToTheQuestion