任务不包含Select的定义

时间:2018-01-12 20:19:45

标签: c#

我正在进行异步httpclient调用,如下所示。

var myDataDtos = new GetAvailableCoursesCommand()
            .SetUserId(Id)
            .ExecuteAsync();

我在.Select()部分收到错误。它说Task不包含Select

的定义
var yourData = new List<string>(myDataDtos.Select(x => x.Id.ToString()));

HttpClient方法如下:

public async override Task ExecuteAsync()
{
    await _httpService.GetAsync(Url, _parameters, SuccessAction, ErrorAction);
}

public async Task GetAsync<T>(string url, Dictionary<string, object> parameters, Action<T> successAction,
        Action<Exception> errorAction = null)
        where T : class
{
        await GoRequestAsync(url, parameters, HttpMethod.Get, successAction, errorAction);
}

 private static async Task GoRequestAsync<T>(string url, Dictionary<string, object> parameters, HttpMethod method,
            Action<T> successAction, Action<Exception> errorAction = null, string body = "")
            where T : class
        {
            using (var httpClient = new HttpClient(new HttpClientHandler()))
            {
               await GoRequest(httpClient, request,
                    response =>
                    {
                        if (successAction == null)
                        {
                            return;
                        }
                        try
                        {
                            var result = typeof (T) == typeof (string)
                                ? response as T
                                : JsonConvert.DeserializeObject<T>(response);
                            successAction(result);
                        }
                        catch (Exception ex)
                        {
                            if (errorAction != null)
                            {
                                errorAction(ex);
                            }
                        }
                    },
                    error =>
                    {
                        if (errorAction != null)
                        {
                            errorAction(error);
                        }
                    });
            }
        }

2 个答案:

答案 0 :(得分:1)

此代码运行时

var myDataDtos = new GetAvailableCoursesCommand()
            .SetUserId(Id)
            .ExecuteAsync();

你得到一个Task类型的对象,正如编译器所说的那样没有.Select的定义

您需要等待任务才能真正获得结果。像这样的东西

var myDataDtos = await (new GetAvailableCoursesCommand()
            .SetUserId(Id)
            .ExecuteAsync());

答案 1 :(得分:1)

你的问题从这里开始:

public async override Task ExecuteAsync()
{
    await _httpService.GetAsync(Url, _parameters, SuccessAction, ErrorAction);
}

如果您无法将数据返回给来电者,那么执行GET的重点是什么?
您有两种选择:

  1. 如果您是基类的所有者(无论是谁宣布ExecuteAsync):

    public async override Task<T> ExecuteAsync<T>()
    {
        return await _httpService.GetAsync(Url, _parameters, SuccessAction, ErrorAction);
    }
    
  2. 如果您不是该类的所有者或者您无法更改它(例如,由于来自界面的方法),您将需要完全跳过对ExecuteAsync的呼叫并致电GoAsync你自己。由于您未提供有关方法使用的数据来源的任何详细信息,因此我无法举例说明。

  3. 如前所述,无论您使用哪种方法,您仍需要将来电者更改为:

    var data = new GetAvailableCoursesCommand().SetUserId(Id);
    var myDataDtos = await data.ExecuteAsync();