2010-03-13 20 views
37

Je veux exposer la méthode WebClient.DownloadDataInternal comme ci-dessous:Comment appeler une méthode avec un paramètre 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 a un paramètre, je ne sais pas comment l'appeler. Aide!

Répondre

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

Vous appelez une méthode avec un paramètre out via la réflexion comme toute autre méthode. La différence est que la valeur retournée sera copiée dans le tableau de paramètres afin que vous puissiez y accéder à partir de la fonction appelante.

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

La première ligne cann't être compilé. – ldp615

+4

Man, vous êtes le meilleur! – Luca

+0

que se passerait-il s'il y a une autre méthode surchargée ??? ------- 1 -------- test int (int i, chaîne sortante s) { s = ""; return 0; } -------------- et ----------- test int (int i) { return 0; } – MrClan