web-dev-qa-db-ja.com

C#:ジェネリックメソッドに渡す実行時に型パラメーターを取得する

一般的な方法は...

    public void PrintGeneric2<T>(T test) where T : ITest
    {
        Console.WriteLine("Generic : " + test.myvar);
    }

これをMain()から呼び出しています...

    Type t = test2.GetType();       
    PrintGeneric2<t>(test2);

「CS0246:タイプまたは名前空間名 't'が見つかりませんでした」および「CS1502:オーバーロードされたメソッドに最も一致するDoSomethingClass.PrintGeneric2 <t>(T)に無効な引数があります」というエラーが表示される

これは私の前の質問と関連しています: C#:汎用オブジェクトを渡す

ジェネリック型は、リフレクションまたはmethodinfoを使用しないと実行時に決定できないことを読みましたが、このインスタンスでそれを行う方法についてはあまり明確ではありません。

あなたが私を啓発することができれば感謝します=)

18
user1229895

コンパイル時に不明な型パラメーターを使用してジェネリックメソッドを本当に呼び出したい場合は、次のように記述できます。

typeof(YourType)
    .GetMethod("PrintGeneric2")
    .MakeGenericMethod(t)
    .Invoke(instance, new object[] { test2 } );

ただし、他の回答で述べられているように、Genericsはあなたのケースでは最良のソリューションではないかもしれません。

28
Matthias

ジェネリックスはコンパイル時間パラメトリック多態性を提供します。 Runtimeでのみ指定されたタイプでそれらを使用しようとしています。短い答え:それは機能せず、理由もありません(反射を除いて、それはまったく別の獣です)。

7
Adrian Zanescu

ただ電話する:

PrintGeneric2(test2);

コンパイラは、渡したものから<t>を推測します。

1
Moo-Juice