型パラメータがコンパイル時には不明だが、実行時に動的に取得される場合にジェネリック メソッドを呼び出す最適な方法は何ですか?
次のサンプル コードを検討してください。メソッド内で、変数に格納されているものを使用して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>()
{
//...
}
}
ベストアンサー1
まずリフレクションを使ってメソッドを取得し、次に型引数を指定して「構築」する必要があります。ジェネリックメソッドの作成:
MethodInfo method = typeof(Sample).GetMethod(nameof(Sample.GenericMethod));
MethodInfo generic = method.MakeGenericMethod(myType);
generic.Invoke(this, null);
静的メソッドの場合は、null
の最初の引数として渡しますInvoke
。これはジェネリック メソッドとは関係なく、通常のリフレクションです。
前述のように、C# 4 では、型推論を使用できる場合は、これを使用すると、その多くが簡単になりますdynamic
。質問の正確な例のように、型推論が利用できない場合は役に立ちません。