1. ホーム
  2. c#

[解決済み] リフレクションを使ってジェネリックメソッドを呼び出すにはどうしたらいいですか?

2022-03-17 13:46:31

質問

コンパイル時に型パラメータが分からず、実行時に動的に取得される場合、ジェネリックメソッドを呼び出す最良の方法は何でしょうか?

次のサンプルコードを考えてみましょう。 Example() メソッドを呼び出す最も簡潔な方法は何でしょうか? GenericMethod<T>() を使用しています。 Type に格納されている myType という変数がありますか?

public class Sample
{
    public void Example(string typeName)
    {
        Type myType = FindType(typeName);

        // What goes here to call GenericMethod<T>()?
        GenericMethod<myType>(); // This doesn't work

        // What changes to call StaticMethod<T>()?
        Sample.StaticMethod<myType>(); // This also doesn't work
    }

    public void GenericMethod<T>()
    {
        // ...
    }

    public static void StaticMethod<T>()
    {
        //...
    }
}

解決方法は?

まずリフレクションを使ってメソッドを取得し、それから MakeGenericMethod :

MethodInfo method = typeof(Sample).GetMethod(nameof(Sample.GenericMethod));
MethodInfo generic = method.MakeGenericMethod(myType);
generic.Invoke(this, null);

静的メソッドの場合は null を第一引数として Invoke . これはジェネリックメソッドとは何の関係もなく、普通のリフレクションです。

前述のとおり、C# 4 では、この多くは dynamic - もちろん、型推論が使えればの話ですが。質問にあるような正確な例のように、型推論が使えないケースでは役に立ちません。