SSブログ

re: 覚えてないとハマりそうなこと [プログラム]

元ネタ:覚えてないとハマりそうなこと

最初に書いたコメントで大きく勘違いして他の方を混乱させてしまったので,罪滅ぼしがてらにStreetw☆さんから要望のありました,Reflectionによるbaseクラスの明示的に実装されたインターフェースメソッドの呼び出しコードを。

using System;
using System.Reflection;

interface IFoo
{
    void Bar ();
}

class BaseFoo : IFoo
{
    void IFoo.Bar ()
    {
        Console.WriteLine("Called : BaseFoo.IFoo.Bar");
        Console.WriteLine();
    }
}

class DerivedFoo : BaseFoo, IFoo
{
    void IFoo.Bar ()
    {
        Console.WriteLine("Called : DerivedFoo.IFoo.Bar");
        Console.WriteLine();
    }
}

class Program
{
    delegate void Action (); // For .NET Framework 3.0 or earlier

    static void Main ()
    {
        DerivedFoo foo = new DerivedFoo();
        BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;

        // Derived.IFoo.Barの間接呼び出し
        MethodInfo methodDerived = typeof(DerivedFoo).GetMethod("IFoo.Bar", flags);
        methodDerived.Invoke(foo, null);

        // BaseFoo.IFoo.Barの間接呼び出し
        MethodInfo methodBase = typeof(BaseFoo).GetMethod("IFoo.Bar", flags);
        methodBase.Invoke(foo, null);
    }
}

GetMethodsで列挙してみたら,IFoo.Barが複数あったのでこの方法を見つけました。 できることなら避けたいですけど,一応,やる方法はある,ということで。


タグ:.NET Framework
コメント(1)  トラックバック(0) 

コメント 1

Streetw☆

こんにちは!
こちらのブログで罪滅ぼしされてたことに今頃気付きましたw
(自分の名前を検索していて見つけたなんてはずかしくて言えないw)

↑のコードですが、私のところで実行してもMethodInfoは取得できないし、あっちで(こちらに書いていただいてるのに気付かず後から)書いてた私のコードとの違いって無さそうでしたので、ん~~~~って思ってたら、わかりました!

GetMethodに渡す名前にインターフェイス名を含める場合は、
ちゃんとフルネームで指定する必要があったんでした!!!
わかってしまえば、単純な話でしたw

私のところで↑のコードで取得できなかったのは、
新規プロジェクトを作成してできた "WindowsFormsApplication1" という名前空間の中にコードを入れて実行したためでした。。。
この場合は、
GetMethod("WindowsFormsApplication1.IFoo.Bar", flags)
ってすればちゃんと取得できました!

やっっとスッキリできました♪
シャノンさんのところにも一応報告してこよって思ってます。
どうもでした~
by Streetw☆ (2008-07-24 17:21) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

re: リンクいろいろWPFでFolderBrowserDia.. ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。