Handling multiple MassTransit response types
It's possible, providing c is your response from the bus, to do a lot of this without needing Reflection. Instead we can use a separate method and the joys of implicit typing to work out the type of TResponse for us.

Proposed solution

public IGenericResponse&lt;TPayload&gt; PublishRequest&lt;TMessage, TPayload&gt;(TMessage message, Type[] potentialResponseTypes)
        where TMessage : class
{
    IGenericResponse&lt;TPayload&gt; commandResult = null;

    _bus.PublishRequest(message, response =&gt;
    {
        foreach (Type responseType in potentialResponseTypes)
        {
            var genericHandler = CreateHandler(response, message);
        }

        c.SetTimeout(10.Seconds());
    });

    return commandResult;
}

private GenericHandler&lt;TResponse, TMessage&gt; CreateHandler&lt;TResponse,TMessage&gt;(TResponse response, TMessage message)
{
    var handler = new Action&lt;object&gt;(result =&gt;
    {
        commandResult = (IGenericResponse&lt;TPayload&gt;) result;
    });
    return new GenericHandler&lt;TResponse, TMessage&gt;(response, handler);
}