2015-09-01 8 views
11

I recently узнал, что любой объект с методом GetAwaiter, возвращающий awaiter, может быть await -ed. Это верно, даже если это метод расширения, то есть в основном любой объект может быть сделан await -able, если вы так решите.Можно ли определить, является ли объект ожидаемым во время выполнения?

Но есть ли способ рассказать во время выполнения, если объект await -able? Нормальное отражение не будет работать, поскольку оно не отображает методы расширения объекта.

У меня нет особой необходимости при задании этого вопроса, мне просто интересно, если это возможно.

+1

Нет, потому что оба метода используют утиную печать, которая выполняется компилятором. Даже если бы вы могли, что бы вы с этой информацией? –

+0

Есть ли простая причина, по которой вы не можете искать методы расширения с отражением? Я понимаю, почему они не доступны, но я не вижу причин, по которым вы не можете их искать. – 31eee384

+1

@ 31eee384 набор доступных расширений зависит от используемых операторов в исходном коде или от набора сборок, которые в данный момент загружаются. – usr

ответ

7

Это невозможно, потому что информация, которую использует компилятор C# для принятия этого решения, отсутствует.

Чтобы устранить методы расширения, нам необходимо знать импортируемые пространства имен. Эта информация недоступна во время выполнения. Это концепция C#. CLR не знает, что такое using.

Я не могу думать о какой-либо причине, по которой вы хотите увидеть, возможно ли объект во время выполнения, потому что вы не можете действовать по этой информации. Может быть, вы можете проверить, есть ли объект Task?

+0

Согласно [этому вопросу] (http://stackoverflow.com/a/299526/238419), можно определить методы расширения во время выполнения, что сделало бы это рассуждение неправильным. –

+0

@ BlueRaja-DannyPflughoeft 'Вы должны смотреть во всех сборках, где может быть определен метод расширения. Это невозможно, потому что вы не можете знать, какие сборки были указаны во время компиляции, но, возможно, остались неиспользованными и отброшенными. Кроме того, вы не знаете, какие из них были на месте. Кроме того, могут быть расширения, определенные в сборках, которые никогда не упоминались нигде, кроме существующих. – usr

Смежные вопросы