创建并调用通用异步方法

时间:2014-01-21 16:51:50

标签: c# generics

我有一种情况需要在通用声明中动态确定对象的类型(编译时间很好)。

我有这样的方法:

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时的Request类型。问题是你不能在类型声明中执行data.GetType()。

2 个答案:

答案 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来电。

答案 1 :(得分: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;
}