Reflectionによるメソッド呼び出し時の例外

ちょっと嵌りました。

using System;

class MyException : Exception {}

class Foo 
{
    public void Bar() 
    {
        throw new MyException ();
    }
}

static class Program 
{
    static void Main () 
    {
        Foo foo = new Foo ();
        try 
        {
            foo.Bar ();
        }
        catch (MyException) 
        {
            Console.WriteLine ("Catch!");
        }

        Type t = foo.GetType();
        try 
        {
            t.GetMethod("Bar").Invoke(foo, null);
        }
        catch (MyException) 
        {
            Console.WriteLine ("Catch!");
        }
        catch (System.Reflection.TargetInvocationException) 
        {
            Console.WriteLine ("お前は誰だ!");
        }
    }
}

/* 結果
Catch!
お前は誰だ!
 */

Reflection経由だと、メソッド内で発生した例外がTargetInvocationExceptionでラップされるんですね。単体テストではOKだったコードが結合テストでNGになって悩みました。


大連のホテルからの書き込みでした。(^^;