- PR -

Reflectionで引数が列挙型のメソッドを実行できない

1
投稿者投稿内容
小次郎
会議室デビュー日: 2003/11/07
投稿数: 12
投稿日時: 2003-11-07 13:52
お世話になります。
Reflectionで引数が列挙型のメソッドを使おうとしているのですが
GetMethodを実行してもnullが返ってきてしまい実行できません
知っている方がいればご教授願いませんか?


[ メッセージ編集済み 編集者: 小次郎 編集日時 2003-11-07 13:53 ]
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-11-09 01:01
こんにちわ。諸農です。
引用:

Reflectionで引数が列挙型のメソッドを使おうとしているのですが
GetMethodを実行してもnullが返ってきてしまい実行できません
知っている方がいればご教授願いませんか?



何を知っていて何を伝えることができればいいのか、
ご質問の内容からはちょっと良くわかりませんが。。(^^

次のクラスを作成して、メソッドのパラメータタイプを取得してみましたが、
うまくいっているようです。
ダメだったと言うコードをアップされてみてはいかがでしょうか。

コード:
//このメソッドはフォームクラス内に定義しています。
    private void MethodParaList(string AClassName,string AMethodName)
    {
        listBox1.Items.Add(AClassName);
        listBox1.Items.Add(AMethodName);

        Assembly ass = Assembly.LoadFrom(Application.ExecutablePath);
        Type t = ass.GetType(AClassName);
        MethodInfo mi = t.GetMethod(AMethodName);
        ParameterInfo[] pis = mi.GetParameters();
        foreach (ParameterInfo pi in pis)
        {
            listBox1.Items.Add(((Type)pi.ParameterType).ToString());
        }
    }

}
//このクラスは上記のフォームクラスと同じ名前空間内に定義しています。
public class MyClass
{
    public enum MyEnum {one,two,three};
    public int ConvEnumToInt(MyEnum en)
    {
        return (int)en;
    }
}



ではでは(^^)/

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
小次郎
会議室デビュー日: 2003/11/07
投稿数: 12
投稿日時: 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);
}

Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-11-11 09:30
こんにちわ。諸農です。

引用:

//引数にIsolationLevelが無いモノは動作したのですが・・・
//ちなみにこのメソッドにはオーバーロードがあるのでtypesの所で引数のタイプを設定しています。



SqlConnection.BeginTransactionでは試していませんが、
代わりに先に挙げたクラスにオーバーロードバージョンの
メソッドを追加してみました。

コード:
private int DoMethod(object AObj,string AMethodName,MyClass.MyEnum e)
{
    Type t = AObj.GetType();
    Type[] ts = new Type[1];
    ts.SetValue(e.GetType(),0);
    object[] os = new object[1];
    os.SetValue(e,0);
    MethodInfo mi = t.GetMethod(AMethodName,ts);
    return (int)mi.Invoke(AObj,os);
}

public class MyClass
{
    public enum MyEnum {one,two,three};
    public int ConvEnumToInt(MyEnum en)
    {
        return (int)en;
    }
    public int ConvEnumToInt(int i)
    {
        return i;
    }
}



結果的にはうまく行くようです。

ちなみに、コード中で利用されている「instance」変数に、
インスタンスがセットされていることが確認できますか?

ではでは(^^)/
_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
小次郎
会議室デビュー日: 2003/11/07
投稿数: 12
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)