none
ref 引数のあるメソッドを MethodInfo.Invoke で呼び出したい RRS feed

  • 質問

  • ref 引数のあるメソッドを MethodInfo.Invoke で呼び出したい


    ref 引数のあるメソッドの MethodInfo を以下のように GetMethod で取得すると
    null が返り、MethodInfo.Invoke を呼び出すことができません。
    ref がなければうまくいくのですが、ref がある場合に
    GetMethod を成功させるにはどうすればよいのでしょうか?

        public class SampleClass
        {
            private void SampleMethod(object value1, ref object value2)
            {
                // 処理
            }
        }

        static void Main(string[] args)
        {
            SampleClass sampleClass = new SampleClass();
            Type type = sampleClass.GetType();
            object[] objs = new object[] {obj1, obj2};
            Type[] types = new Type[] {typeof(object), typeof(object)};
            MethodInfo methodInfo = type.GetMethod(
                "SampleMethod",
                BindingFlags.Instance | BindingFlags.NonPublic,
                null,
                types,
                null);
            methodInfo.Invoke(sampleClass, objs);
        }

    なお、InvokeMember を使う以下の方法だと ref があってもなくてもうまくいくようです。

        static void Main(string[] args)
        {
            SampleClass sampleClass = new SampleClass();
            Type type = sampleClass.GetType();
            object[] objs = new object[] {obj1, obj2};
            type.InvokeMember(
                "SampleMethod",
                BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic,
                null,
                sampleClass,
                objs);
        }

    よろしくお願いします。

    環境:Win2000、VS2003

    2006年6月21日 6:18

回答

  •  なちゃ さんからの引用

    なら、Type.GetType("System.Object&")みたいな感じで。

    実際には ref 引数は System.Object ではなく自分で定義した型だったので、

        Type.GetType("SampleNamespace.ParameterClass&")

    のようにして試してみましたが、
    ParameterClass が別なアセンブリで定義されているためか、うまくいきませんでした。

    以下のいずれかのようにするとうまくいきました。

        Type refType = typeof(ParameterClass);
        refType.Assembly.GetType(refType.FullName + "&")

    または

        Type refType = typeof(ParameterClass);
        Type.GetType(refType.FullName + "&, "+ refType.Assembly.FullName)

    それにしても .NET 2.0 は便利そうですね。
    Hongliang さん、なちゃ さん、どうもありがとうございました。

    2006年6月23日 6:17

すべての返信

  • Type[] types = new Type[] { typeof(object), typeof(object).MakeByRefType() };
    2006年6月21日 12:25
  • 問題は MakeByRefType が .NET 2.0 から提供されるメソッドであるという点ですねぇ。わざわざ追加されたという事はそれ以前には該当する機能がなかったという可能性が高いし。

    カスタム Binder を使うか、GetMethods で列挙して特定するか、ref パラメータを持つダミーメソッドを用意しておいて事前にそれの引数の型を保存しておくか。

    と言った辺りしか思いつきませんねー。

    2006年6月21日 16:52
  •  Hongliang さんからの引用

    問題は MakeByRefType が .NET 2.0 から提供されるメソッドであるという点ですねぇ。わざわざ追加されたという事はそれ以前には該当する機能がなかったという可能性が高いし。

    おお?さいでしたか…

    なら、Type.GetType("System.Object&")みたいな感じで。

     

    2006年6月21日 17:07
  •  なちゃ さんからの引用

    なら、Type.GetType("System.Object&")みたいな感じで。

    実際には ref 引数は System.Object ではなく自分で定義した型だったので、

        Type.GetType("SampleNamespace.ParameterClass&")

    のようにして試してみましたが、
    ParameterClass が別なアセンブリで定義されているためか、うまくいきませんでした。

    以下のいずれかのようにするとうまくいきました。

        Type refType = typeof(ParameterClass);
        refType.Assembly.GetType(refType.FullName + "&")

    または

        Type refType = typeof(ParameterClass);
        Type.GetType(refType.FullName + "&, "+ refType.Assembly.FullName)

    それにしても .NET 2.0 は便利そうですね。
    Hongliang さん、なちゃ さん、どうもありがとうございました。

    2006年6月23日 6:17