2015-09-01 14 views
11

I recently ho appreso che qualsiasi oggetto con un metodo GetAwaiter che restituisce un awaiter può essere await -ed. Questo è vero anche se si tratta di un metodo di estensione, che significa in pratica qualsiasi oggetto può essere reso await, se lo si desidera.È possibile stabilire se un oggetto è attendibile in fase di runtime?

Ma c'è un modo per dire al runtime se un oggetto è await -able? La riflessione normale non funzionerà, poiché non elenca i metodi di estensione di un oggetto.

Non ho una particolare necessità in mente quando faccio questa domanda, sono solo curioso di sapere se è possibile.

+1

No, perché entrambi i metodi utilizzano la digitazione anatra che viene eseguita dal compilatore. Anche se tu potessi, cosa vorresti fare con quelle informazioni? –

+0

C'è un motivo semplice per cui non è possibile cercare i metodi di estensione con la riflessione? Posso capire perché non sono prontamente disponibili, ma non vedo un motivo per cui non puoi cercarli. – 31eee384

+1

@ 31eee384 il set di estensioni disponibili dipende dalle istruzioni using nel codice sorgente o dal set di assembly che si verificano per essere caricati al momento. – usr

risposta

7

Non è possibile perché le informazioni che il compilatore C# utilizza per prendere questa decisione sono sparite.

Per risolvere i metodi di estensione è necessario conoscere gli spazi dei nomi che vengono importati. Questa informazione non è disponibile in fase di runtime. È un concetto di C# solo. Il CLR non sa cosa sia un using.

Non riesco a pensare a nessun motivo per vedere se un oggetto è probabilmente attendibile in fase di esecuzione perché non è possibile agire su tali informazioni. Forse potresti controllare se l'oggetto è un Task?

+0

Secondo [questa risposta] (http://stackoverflow.com/a/299526/238419), è possibile determinare i metodi di estensione in fase di esecuzione, il che renderebbe questo ragionamento errato. –

+0

@ BlueRaja-DannyPflughoeft 'È necessario cercare in tutti gli assembly in cui è possibile definire il metodo di estensione. Ciò non è possibile in quanto non è possibile sapere quali gruppi sono stati referenziati in fase di compilazione, ma forse non sono stati utilizzati e scartati. Inoltre, non conosci gli usi che erano in atto. Inoltre, potrebbero esserci estensioni definite in assiemi che non sono mai stati referenziati da nessuna parte ma esistono. – usr

Problemi correlati