やりたいこと。
こんなクラスがあったとして。。。
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を使って取り出すことができました。複雑なケースがどうなるのはは不明なので、そのあたりは今後の課題というところでしょうか。