Не содержит определения для "GetAwaiter"

Я получаю приведенную ниже ошибку с указанным ниже набором кода. Это ошибка в строке 'alliancelookup', я не уверен, что делаю неправильно, но сам ничего не видел. Похоже, что запрос, который я запускаю на вершине, работает нормально, но, похоже, проблема, с которой он столкнулся, связана с Официантом, мне было интересно, есть ли способ обойти это?

DynamicCrest crest = new DynamicCrest();
var root = await crest.GetAsync(crest.Host);
var alliancelookup = await (await root.GetAsync(r => r.alliances)).First(i => i.shortName == e.GetArg("allianceticker").ToUpper());
allianceid = alliancelookup.id;

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: "System.Dynamic.ExpandoObject" не содержит определения для "GetAwaiter" в CallSite.Target(Closure, CallSite, Object) в System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](site, T0 arg0) в ***. Program.<> c. d.MoveNext () в C:\Users---\Documents\Visual Studio 2015\Projects------\Program.cs: строка 95

3 ответа

Невозможно точно знать, что не так без минимального, полного, проверяемого примера, но похоже, что вы awaitчто-то, что не должно быть awaitредактор

Расщепление alliancelookup линия:

// Asynchronously retrieve the alliances.
var alliances = await root.GetAsync(r => r.alliances);

// Synchronously get the first matching one.
var allianceLookup = alliances.First(i => i.shortName == e.GetArg("allianceticker").ToUpper());

Там может быть лучший подход, перемещая фильтр в асинхронный код, но это зависит от DynamicCrest,

Вас ждут еще больше, чем вам нужно. Вам нужно только дождаться асинхронных методов, но вы также ожидаете результата, который явно объявлен как dynamic, Вот почему вы не получаете ошибку времени компиляции.

С dynamic он попытается связать метод, который необходим во время выполнения. Этот метод при использовании async -.GetAwaiter(), поэтому RuntimeBinderException "не содержит определения для" GetAwaiter ""

Тем не менее, третья строка должна быть:

var alliancelookup = (await root.GetAsync(r => r.alliances)).First(i => i.shortName == e.GetArg("allianceticker").ToUpper());

Хотя расщепление, как предложено Стивеном Клири, является лучшей практикой.

Вы ожидаете асинхронного вызова, поэтому вы должны поместить асинхронную задачу в начало метода, где вы вызываете этот код

public async Task<returntyp> Name()
{
  DynamicCrest crest = new DynamicCrest();
  var root = await crest.GetAsync(crest.Host);
  var alliancelookup = await (await root.GetAsync(r => r.alliances)).First(i => i.shortName == e.GetArg("allianceticker").ToUpper());
  allianceid = alliancelookup.id;
Другие вопросы по тегам