実行時に決定される型を使用してジェネリック メソッドを呼び出す
この問題は、コンパイル時に不明な型パラメーターを使用してジェネリック メソッドを呼び出そうとすると発生します。 。通常のメソッド呼び出しはコンパイラによって実行される型安全性チェックに依存しますが、型が実行時にのみ使用できる場合は、代替アプローチが必要になります。
リフレクションベースのソリューション
提供されているコード例のコンテキストでは:
public void Method<T>() where T : class {} public void AnotherMethod() { ... foreach (var interface in interfaces) { Method<interface>(); // Compile error! } }
コンパイル時の型をバイパスするにはチェック:
Type.GetMethod を使用してオープン ジェネリック メソッドを取得します:
MethodInfo method = typeof(Test).GetMethod("Method");
汎用メソッドMakeGenericMethod:
MethodInfo genericMethod = method.MakeGenericMethod(interface);
Invoke:
genericMethod.Invoke(null, null); // No target or arguments in this case
でメソッドを呼び出す完了例
プロセスを明確にするために、次の改訂されたコード サンプルを検討してください。
using System; using System.Linq; using System.Reflection; namespace Sample { interface IFoo { } interface IBar { } class Program { public static void CallMe<T>() { Console.WriteLine("Type of T: {0}", typeof(T)); } static void Main() { var types = typeof(Program).Assembly.GetTypes().Where(t => t.Namespace == "Sample"); var methodInfo = typeof(Program).GetMethod("CallMe"); foreach (var type in types) { var genericMethodInfo = methodInfo.MakeGenericMethod(type); genericMethodInfo.Invoke(null, null); } } } }
この例では、Sample 名前空間で見つかった型に基づいて、汎用 CallMe メソッドが動的に呼び出されます。 .
以上が実行時に決定される型でジェネリック メソッドを呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。