2014-01-21 2 views
0

У меня возникла ситуация, когда мне нужно динамически определять тип объекта (время компиляции в порядке) в объявлении для общего.Создайте и вызовите общий метод async

У меня есть метод, как это:

private async Task<T> Post<T>(string path, Request data) 
{ 
    var authPath = GetAuthenticatedPath(path); 
    var response = await _client.PostAsJsonAsync<Request>(authPath, data); 
    return response; 
} 

Проблема заключается в том, что мне действительно нужно, чтобы работать больше, как это:

private async Task<T> Post<T>(string path, Request data) 
{ 
    var authPath = GetAuthenticatedPath(path); 
    var response = await _client.PostAsJsonAsync<data.GetType()>(authPath, data); 
    return response; 
} 

Потому что мне это нужно форматировать переменные данные, как это ActualRequestType, а не тип запроса, когда он выполняет преобразование в JSON. Проблема в том, что вы не можете делать data.GetType() в объявлении типа.

+0

Отражение, вероятно, единственный способ. Однако писать рефлексию для корректной работы с 'await' вполне может быть невозможно. Уч. Поэтому вам, возможно, придется написать переключатель для обработки всех возможных типов ... – Luaan

+0

@AlexeiLevenkov это нормально. Мне просто нужно знать, как сделать работу типа в угловых скобках. Я попробую несколько ответов ниже и посмотрю, поможет ли помощь. – claydiffrient

+0

Удалено мое редактирование ... и вложенное «Время компиляции отлично работает для меня». комментарий. –

ответ

4

Изменить свою подпись к этому:

private async Task<T> Post<T, TRequest>(string path, TRequest data) 
    where TRequest : Request 
{ 
    var authPath = GetAuthenticatedPath(path); 
    var response = await _client.PostAsJsonAsync<TRequest>(authPath, data); 
    return response; 
} 

условие будет убедиться, что вы все еще получая действительные Request объектов, и фактический тип будет продолжаться до звонка PostAsJsonAsync.

+0

Это не совсем то, о чем просили. Это будет использовать тип времени компиляции параметра данных, а не тип времени выполнения. –

+0

@mikez На самом деле, это работает очень хорошо. В мой вопрос было внесено изменение, указывающее «время выполнения». Мои потребности тоже. Время компиляции отлично работает для меня. Я отредактирую вопрос назад, чтобы удалить ограничение времени выполнения. – claydiffrient

+1

+1. @claydiffrient - извините за непонимание вашей проблемы - это действительно стандартный способ указать тип во время компиляции. –

0

метод PostAsJsonAsync вернуть Task<HttpResponseMessage> так, возможно, вам не нужно возвращать родовое, только получить как этот

private async Task<HttpResponseMessage> Post<T>(string path, T data) 
{ 
    var authPath = GetAuthenticatedPath(path); 
    var response = await _client.PostAsJsonAsync<T>(authPath, data); 
    return response; 
} 
+0

Вероятно, необходимо будет также ограничить 'T'' Request'. –

+1

Но 'T' является типом ответа и, возможно, отличается от типа запроса – Alberto

+0

@Alberto, это правильно. – claydiffrient

Смежные вопросы