public static T SendReceive <T>(
            object redisNativeClient,
            byte[][] cmdWithBinaryArgs,
            object fn,
            object completePipelineFn,
            bool sendWithoutRead,
            int opCode,
            int mdToken,
            long moduleVersionPtr)
        {
            if (redisNativeClient == null)
            {
                throw new ArgumentNullException(nameof(redisNativeClient));
            }

            Func <object, byte[][], object, object, bool, T> instrumentedMethod;

            try
            {
                var instrumentedType = redisNativeClient.GetInstrumentedType(RedisNativeClient);
                instrumentedMethod =
                    MethodBuilder <Func <object, byte[][], object, object, bool, T> >
                    .Start(moduleVersionPtr, mdToken, opCode, nameof(SendReceive))
                    .WithConcreteType(instrumentedType)
                    .WithParameters(cmdWithBinaryArgs, fn, completePipelineFn, sendWithoutRead)
                    .WithMethodGenerics(typeof(T))
                    .WithNamespaceAndNameFilters(ClrNames.Ignore, "System.Byte[][]", "System.Func`1", "System.Action`1", ClrNames.Bool)
                    .Build();
            }
            catch (Exception ex)
            {
                Log.ErrorRetrievingMethod(
                    exception: ex,
                    moduleVersionPointer: moduleVersionPtr,
                    mdToken: mdToken,
                    opCode: opCode,
                    instrumentedType: RedisNativeClient,
                    methodName: nameof(SendReceive),
                    instanceType: redisNativeClient.GetType().AssemblyQualifiedName);
                throw;
            }

            RedisNativeClientData clientData = redisNativeClient.As <RedisNativeClientData>();

            using (var scope = RedisHelper.CreateScope(
                       Tracer.Instance,
                       IntegrationName,
                       clientData.Host ?? string.Empty,
                       clientData.Port.ToString(CultureInfo.InvariantCulture),
                       GetRawCommand(cmdWithBinaryArgs)))
            {
                try
                {
                    return(instrumentedMethod(redisNativeClient, cmdWithBinaryArgs, fn, completePipelineFn, sendWithoutRead));
                }
                catch (Exception ex)
                {
                    scope?.Span?.SetException(ex);
                    throw;
                }
            }
        }