繁体   English   中英

创建并调用通用异步方法

[英]Create and invoke generic async method

我遇到一种情况,需要在泛型的声明中动态确定对象的类型(编译时很好)。

我有这样的方法:

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;
}

因为在转换为JSON时,我需要它来格式化数据变量的格式为ActualRequestType而不是Request类型。 问题是您不能在类型声明中执行data.GetType()。

修改您的签名为此:

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调用。

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM