- - PR -
Reflectionで引数が列挙型のメソッドを実行できない
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-11-07 13:52
お世話になります。
Reflectionで引数が列挙型のメソッドを使おうとしているのですが GetMethodを実行してもnullが返ってきてしまい実行できません 知っている方がいればご教授願いませんか? [ メッセージ編集済み 編集者: 小次郎 編集日時 2003-11-07 13:53 ] | ||||||||
|
投稿日時: 2003-11-09 01:01
こんにちわ。諸農です。
何を知っていて何を伝えることができればいいのか、 ご質問の内容からはちょっと良くわかりませんが。。(^^ 次のクラスを作成して、メソッドのパラメータタイプを取得してみましたが、 うまくいっているようです。 ダメだったと言うコードをアップされてみてはいかがでしょうか。
ではでは(^^)/ _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||
|
投稿日時: 2003-11-10 11:17
//レスどうもありがとうございます。
//しかしやはりnullが返ってきて動かないようです。 //SqlConnectionのBeginTransactionの動きを再現しているのですが //MethodInfo mi = instance.GetType().GetMethod("BeginTransaction",types);の部分でnullが戻ってきます。 //引数にIsolationLevelが無いモノは動作したのですが・・・ //ちなみにこのメソッドにはオーバーロードがあるのでtypesの所で引数のタイプを設定しています。 using System.Data; public BeginTransaction(IsolationLevel iso) { Type[] types = new Type[1]{iso.GetType()}; object[] args = new Object[1]{iso}; MethodInfo mi = instance.GetType().GetMethod("BeginTransaction",types); object o = mi.Invoke(instance,args); } | ||||||||
|
投稿日時: 2003-11-11 09:30
こんにちわ。諸農です。
SqlConnection.BeginTransactionでは試していませんが、 代わりに先に挙げたクラスにオーバーロードバージョンの メソッドを追加してみました。
結果的にはうまく行くようです。 ちなみに、コード中で利用されている「instance」変数に、 インスタンスがセットされていることが確認できますか? ではでは(^^)/ _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||||||
|
投稿日時: 2003-11-11 15:16
諸農さんの書かれたサンプルは呼出しをするサンプルと
列挙型の定義してある場所が同じだからコールできるはずです。 こちらで実行している環境はSystem.Dataをusingして System.Data.SqlClientをアセンブリからロードしています。 だからBeginTransaction(IsolationLevel)をコールした時に IsolationLavelの列挙型をBeginTransaction内で正常にマッピングできないんじゃないかなと思うんですけど こちらでわかった事なのですが SqlConnectionオブジェクトを生成してそのオブジェクトを渡してInvokeすると実行できるのですが アセンブリからロードしたオブジェクトを渡して実行すると失敗するようです。 //object o にはSqlTransactionオブジェクトが戻ります。 Type[] types = new Type[]{iso.GetType()}; bject[] args = new Object[]{iso}; MethodInfo mi = this.GetMethodInfo("BeginTransaction()", types); object o = mi.Invoke(instance,args); |
1