public static void StartGenericWorkflow(this IWorkflowHost host, object workflow) { //var reg = host.Registry; var method = host.GetType() .GetMethods() .Where(m => m.IsGenericMethod && m.Name == "StartWorkflow") .First(); var workflowType = workflow.GetType(); var buildMethod = workflowType .GetMethod("Build"); var buildMethodParameterType = buildMethod.GetParameters()[0].ParameterType; var buildMethodDataType = buildMethodParameterType.GetGenericArguments()[0]; var generic = method.MakeGenericMethod(buildMethodDataType); //var invokeType = workflowType // .GetInterfaces() // .FirstOrDefault(i => i.FullName == generic.GetParameters()[0].ParameterType.FullName); var dataInstance = Activator.CreateInstance(buildMethodDataType); var jWorkflow = JObject.FromObject(workflow); generic.Invoke(host, new[] { jWorkflow.Value <string>("Id"), dataInstance, "" }); }