C# 是否有可能判断一个对象在运行时是否可以等待?

C# 是否有可能判断一个对象在运行时是否可以等待?,c#,async-await,C#,Async Await,我了解到,任何使用GetAwaiter方法返回的对象都可以被await-ed。即使是扩展方法,这也是正确的,这意味着基本上任何对象都可以被设置为await-able,如果您选择的话 但是有没有办法在运行时判断对象是否可以等待呢?正常反射不起作用,因为它不列出对象的扩展方法 问这个问题时,我并没有特别的需要,我只是想知道这是否可能。这不可能,因为C#编译器用来做出决定的信息已经不存在了 为了解析扩展方法,我们需要知道导入的名称空间。该信息在运行时不可用。这是一个只有C的概念。CLR不知道使用的是什

我了解到,任何使用
GetAwaiter
方法返回的对象都可以被
await
-ed。即使是扩展方法,这也是正确的,这意味着基本上任何对象都可以被设置为
await
-able,如果您选择的话

但是有没有办法在运行时判断对象是否可以
等待
呢?
正常反射不起作用,因为它不列出对象的扩展方法


问这个问题时,我并没有特别的需要,我只是想知道这是否可能。

这不可能,因为C#编译器用来做出决定的信息已经不存在了

为了解析扩展方法,我们需要知道导入的名称空间。该信息在运行时不可用。这是一个只有C的概念。CLR不知道使用的
是什么


我想不出有什么理由希望看到某个对象在运行时是否可以等待,因为您无法对该信息进行操作。也许您可以检查对象是否是
任务
而不是?

否,因为这两种方法都使用duck类型,这是由编译器完成的。即使可以,您会如何处理这些信息?有没有一个简单的原因让您无法寻找带有反射的扩展方法?我可以理解它们为什么不可用,但我看不出您不能搜索它们的原因。@31eee384可用扩展集取决于源代码中的using语句或当时加载的程序集。@usr-Hmm,因此基本上无法判断源代码中是否有可等待的对象,但是您可以发现,对于当前加载的程序集,是否可以等待它?明白了。@31eee384 uh相反:)您需要usings、当前名称空间、目标成员和编译时引用。根据,可以在运行时确定扩展方法,这将使此推理不正确。@BlueRaja DannyPflughoeft
您必须查看所有可能定义扩展方法的程序集。
这是不可能的,因为您不知道在编译时引用了哪些程序集,但可能未使用并丢弃了这些程序集。而且,你不知道当时的使用情况。此外,在程序集中定义的扩展可能从未在任何地方引用过,但已经存在。