Просто добавление к исходному ответу. Хотя это будет работать:
MethodInfo method = typeof(Sample).GetMethod("GenericMethod");
MethodInfo generic = method.MakeGenericMethod(myType);
generic.Invoke(this, null);
Также немного опасно, что вы теряете проверку времени компиляции для GenericMethod
. Если вы позже выполните рефакторинг и переименуете GenericMethod
, этот код не заметит и не будет работать во время выполнения. Кроме того, если есть какая-либо пост-обработка сборки (например, обфускация или удаление неиспользуемых методов / классов), этот код также может сломаться.
Итак, если вы знаете метод, с которым вы связываетесь во время компиляции , и это не называется миллионы раз, поэтому накладные расходы не имеют значения, я бы изменил этот код:
Action<> GenMethod = GenericMethod<int>; //change int by any base type
//accepted by GenericMethod
MethodInfo method = this.GetType().GetMethod(GenMethod.Method.Name);
MethodInfo generic = method.MakeGenericMethod(myType);
generic.Invoke(this, null);
Хотя вы не очень красивы, у вас есть ссылка времени компиляции на GenericMethod
здесь, и если вы рефакторируете, удаляете или делаете что-либо с помощью GenericMethod
, этот код будет продолжать работать или, по крайней мере, ломаться во время компиляции (если, например, вы удалите GenericMethod
).
Другой способ сделать то же самое - создать новый класс-оболочку и создать его через Activator
. Я не знаю, есть ли лучший способ.