public class AnyImplementer { public int Any(Func func) { return func(10)? 1: 0; } } public class DoStuffer { public bool DoStuff(T obj) { return obj.ToString() != string.Empty; } public int a(Type argType, AnyImplementer anyImplementer) { Type delegateType = typeof(Func<,>).MakeGenericType(new[] { argType, typeof(bool) }); MethodInfo delegatedMethod = this.GetType().GetMethod(nameof(DoStuff), BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance); MethodInfo generic = delegatedMethod.MakeGenericMethod(argType); Delegate myDelegate = Delegate.CreateDelegate(delegateType, this, generic); var args = new object[] { myDelegate }; return (int)anyImplementer.GetType().InvokeMember("Any", BindingFlags.InvokeMethod, null, anyImplementer, args); } } public class Program { public static void Main(string[] args) { DoStuffer DoStuffer = new DoStuffer(); AnyImplementer anyImplementer = new AnyImplementer(); Console.WriteLine(DoStuffer.a(typeof(int), anyImplementer)); } }