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が複数あったのでこの方法を見つけました。 できることなら避けたいですけど,一応,やる方法はある,ということで。
2008-06-05 12:11
コメント(1)
トラックバック(0)
こんにちは!
こちらのブログで罪滅ぼしされてたことに今頃気付きましたw
(自分の名前を検索していて見つけたなんてはずかしくて言えないw)
↑のコードですが、私のところで実行してもMethodInfoは取得できないし、あっちで(こちらに書いていただいてるのに気付かず後から)書いてた私のコードとの違いって無さそうでしたので、ん~~~~って思ってたら、わかりました!
GetMethodに渡す名前にインターフェイス名を含める場合は、
ちゃんとフルネームで指定する必要があったんでした!!!
わかってしまえば、単純な話でしたw
私のところで↑のコードで取得できなかったのは、
新規プロジェクトを作成してできた "WindowsFormsApplication1" という名前空間の中にコードを入れて実行したためでした。。。
この場合は、
GetMethod("WindowsFormsApplication1.IFoo.Bar", flags)
ってすればちゃんと取得できました!
やっっとスッキリできました♪
シャノンさんのところにも一応報告してこよって思ってます。
どうもでした~
by Streetw☆ (2008-07-24 17:21)