2010-03-13 18 views
37

voglio esporre metodo WebClient.DownloadDataInternal come di seguito:Come posso richiamare un metodo con un parametro out?

[ComVisible(true)] 
public class MyWebClient : WebClient 
{ 
    private MethodInfo _DownloadDataInternal; 

    public MyWebClient() 
    { 
     _DownloadDataInternal = typeof(WebClient).GetMethod("DownloadDataInternal", BindingFlags.NonPublic | BindingFlags.Instance); 
    } 

    public byte[] DownloadDataInternal(Uri address, out WebRequest request) 
    { 
     _DownloadDataInternal.Invoke(this, new object[] { address, out request }); 
    } 

} 

WebClient.DownloadDataInternal ha un parametro fuori, non so come richiamare esso. Aiuto!

risposta

18
public class MyWebClient : WebClient 
{ 
    delegate byte[] DownloadDataInternal(Uri address, out WebRequest request); 

    DownloadDataInternal downloadDataInternal; 

    public MyWebClient() 
    { 
     downloadDataInternal = (DownloadDataInternal)Delegate.CreateDelegate(
      typeof(DownloadDataInternal), 
      this, 
      typeof(WebClient).GetMethod(
       "DownloadDataInternal", 
       BindingFlags.NonPublic | BindingFlags.Instance)); 
    } 

    public byte[] DownloadDataInternal(Uri address, out WebRequest request) 
    { 
     return downloadDataInternal(address, out request); 
    } 
} 
102

Si richiama un metodo con un parametro out tramite riflessione proprio come qualsiasi altro metodo. La differenza è che il valore restituito verrà ricopiato nell'array dei parametri in modo che sia possibile accedervi dalla funzione di chiamata.

object[] args = new object[] { address, request }; 
_DownloadDataInternal.Invoke(this, args); 
request = (WebRequest)args[1]; 
+0

La prima linea cann't essere compilato. – ldp615

+4

Uomo, sei il migliore! – Luca

+0

cosa succederebbe se ci fosse un altro metodo sovraccarico ??? ------- 1 -------- test int (int i, out string s) { s = ""; return 0; } -------------- e ----------- int test (int i) { ritorno 0; } – MrClan

Problemi correlati