public async Task PushMessageAsync(string userId, IList <IRequestMessage> messages)
        {
            var req = new LineMessagePushReq()
            {
                To = userId
            };

            foreach (var message in messages)
            {
                switch (message)
                {
                case IMessage:
                    req.Messages.Add(message);
                    break;

                case ITemplate template:
                    req.Messages.Add(new TemplateMessageBase()
                    {
                        Template = template
                    });
                    break;

                case IFlex template:
                    req.Messages.Add(template);
                    break;
                }
            }

            await MakePushRequestToLineApi(req);
        }
        private async Task MakePushRequestToLineApi(LineMessagePushReq req)
        {
            var postJson = JsonConvert.SerializeObject(req, new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore,
                Formatting        = Formatting.Indented,
                ContractResolver  = new CustomPropertyNamesContractResolver()
                {
                    Case = IdentifierCase.Camel,
                    PreserveUnderscores = false,
                },
                Converters = { new StringEnumConverter(typeof(SnakeCaseNamingStrategy)) }
            }).Replace("\"", @"""");


            using var request = new HttpRequestMessage(new HttpMethod("POST"), $"{LineMessagePushApiBaseUrl}");
            request.Headers.TryAddWithoutValidation("Authorization", $"Bearer {_accessToken}");
            request.Content = new StringContent(postJson);
            request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
            var response = await _httpClient.SendAsync(request);

            var content = await response.Content.ReadAsStringAsync();

            if (response.StatusCode == HttpStatusCode.OK)
            {
                return;
            }
            throw new Exception(content);
        }
        public async Task PushMessageByJsonAsync(string userId, string jsonString)
        {
            var req = new LineMessagePushReq()
            {
                To = userId
            };

            req.Messages.Add(new FlexMessage(jsonString));
            await MakePushRequestToLineApi(req);
        }
        public async Task PushMessageAsync(string userId, params string[] messages)
        {
            var req = new LineMessagePushReq {
                To = userId
            };

            foreach (var message in messages)
            {
                req.Messages.Add(new TextMessage(message));
            }

            await MakePushRequestToLineApi(req);
        }