4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ref付引数を持つメソッドをInvokeで呼出し結果をもらうには

Posted at

やりたいこと。

こんなクラスがあったとして。。。

static class Klass1
{
    static public void Method1(string in_str, ref string out_str)
    {
        out_str = "<" + in_str + ">";
    }
}

こういうことを MethodInfo.Invokeを使ってやりたい。

class MyClass
{
    static public void Run()
    {
        string out_str = null;
        Klass1.Method1("test", ref out_str);
        Console.WriteLine(out_str); // 出力 : <test>
    }
}

初めの案(失敗)

こんな感じ

static void Test1()
{
    string out_str = null;
    Type t = typeof(Klass1);
    var m = t.GetMethod("Method1");
    m.Invoke(t, new object { ref out_str } ); // ref は無効です。のエラーが発生。

    Console.WriteLine(out_str);
}

二個目(失敗)

static void Test1()
{
    string out_str = null;
    Type t = typeof(Klass1);
    var m = t.GetMethod("Method1");
    m.Invoke(t, new object { out_str } ); // ref を取る

    Console.WriteLine(out_str); // null

三個目(成功)

ここ(http://stackoverflow.com/questions/8779731/how-to-pass-a-parameter-as-a-reference-with-methodinfo-invoke) を参考にしたらいけた。

static void Test1()
{
    var obj = new object[] { "test", null }; // オブジェクト配列を先に作成。ref変数部分 は nullにする。
    Type t = typeof(Klass1);
    var m = t.GetMethod("Method1");
    m.Invoke(t, obj); // 作成したオブジェクト配列を渡す。

    Console.WriteLine(obj[1]); // ref変数部分の配列インデックスを指定すると値が取れる。
    Console.ReadLine();
}

まとめ

単純なref変数の値をInvokeを使って取り出すことができました。複雑なケースがどうなるのはは不明なので、そのあたりは今後の課題というところでしょうか。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?