Проверьте, доступен ли объектC#

Место общения программистов C#
Ответить
Anonymous
 Проверьте, доступен ли объект

Сообщение Anonymous »

У меня есть метод, который возвращает объект любого типа. Если экземпляр объекта доступен, мне нужно дождаться его и получить результат. Я знаю, что могу проверить, является ли объект Task/ValueTask или их универсальными аналогами, но это не единственные ожидаемые вещи.

Код: Выделить всё

object result = GetResult();

object actualResult = result is Awaitable awaitable // "Awaitable" isn't a thing
? await awaitable
: result;
Спецификация языка C# гласит, что выражение t является ожидаемым, если выполняется одно из следующих условий:
  • имеет динамический тип времени компиляции
  • имеет доступный экземпляр или метод расширения под названием GetAwaiter без параметров и параметров типа, а также возвращаемый тип A, для которого выполняются все следующие условия:
    A реализует интерфейс System.Runtime.CompilerServices.INotifyCompletion
  • A имеет доступное, читаемое свойство экземпляра IsCompleted типа bool
  • A имеет доступный метод экземпляра GetResult без параметров и без параметров типа

Как лучше всего определить, является ли объект ожидаемым или нет?
Другие ответы на вопросы, подобные этому, подсказывают что это невозможно. Это не может быть правдой, поскольку компилятор знает, что является ожидаемым, а что нет. Я ищу некоторые методы уровня платформы для определения ожидания объекта.
Другой практический пример этого имеет место в контроллерах ASP.NET MVC. Методы контроллера могут возвращать IActionResult или Task, и код, выполняющий эти действия, знает, следует ли ожидать объекты результата. Однако я не могу найти место в исходном коде, где происходит эта проверка.

Подробнее здесь: https://stackoverflow.com/questions/787 ... -awaitable
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»