public ThriftMethodHandler(ThriftMethodMetadata methodMetadata, ThriftCodecManager codecManager)
        {
            this.QualifiedName         = methodMetadata.QualifiedName;
            this.Name                  = methodMetadata.Name;
            this._invokeAsynchronously = methodMetadata.IsAsync;
            this._oneway               = !_invokeAsynchronously && methodMetadata.IsOneWay;

            ParameterHandler[] parameters = new ParameterHandler[methodMetadata.Parameters.Count()];

            foreach (var fieldMetadata in methodMetadata.Parameters)
            {
                ThriftParameterInjection parameter = (ThriftParameterInjection)fieldMetadata.Injections.First();

                ParameterHandler handler = new ParameterHandler(
                    fieldMetadata.Id,
                    fieldMetadata.Name,
                    codecManager.GetCodec(fieldMetadata.ThriftType));

                parameters[parameter.ParameterIndex] = handler;
            }
            this._parameterCodecs = parameters;

            var builder = ImmutableDictionary.CreateBuilder <short, IThriftCodec>();

            foreach (var entry in methodMetadata.Exceptions)
            {
                builder.Add(entry.Key, codecManager.GetCodec(entry.Value));
            }
            _exceptionCodecs = builder.ToImmutableDictionary();

            // get the thrift codec for the return value
            _successCodec = codecManager.GetCodec(methodMetadata.ReturnType);
        }
        private static ThriftFieldMetadata CreateFieldMetadata(ThriftCatalog catalog, int index, ParameterInfo parameterInfo)
        {
            ThriftFieldAttribute thriftField   = parameterInfo.GetCustomAttribute <ThriftFieldAttribute>();
            short        parameterId           = short.MinValue;
            String       parameterName         = parameterInfo.Name;
            Requiredness parameterRequiredness = Requiredness.Unspecified;

            if (thriftField != null)
            {
                parameterId           = thriftField.Id;
                parameterRequiredness = thriftField.Required;
                if (!String.IsNullOrWhiteSpace(thriftField.Name))
                {
                    parameterName = thriftField.Name.Trim();
                }
            }
            if (parameterId == short.MinValue)
            {
                parameterId = (short)(index + 1);
            }
            ThriftType thriftType         = catalog.GetThriftType(parameterInfo.ParameterType);
            var        parameterInjection = new ThriftParameterInjection(parameterId, parameterName, index, parameterInfo.ParameterType);

            if (parameterRequiredness == Requiredness.Unspecified)
            {
                // There is only one field injection used to build metadata for method parameters, and if a
                // single injection point has UNSPECIFIED requiredness, that resolves to NONE.
                parameterRequiredness = Requiredness.None;
            }
            ThriftFieldMetadata fieldMetadata = new ThriftFieldMetadata(
                parameterId,
                false /* recursiveness */,
                parameterRequiredness,
                new DefaultThriftTypeReference(thriftType),
                parameterName,
                FieldKind.ThriftField,
                new IThriftInjection[] { parameterInjection });

            return(fieldMetadata);
        }