2010-03-13 17 views
37

Quiero exponer método WebClient.DownloadDataInternal, como a continuación:¿Cómo puedo invocar un método con un parámetro 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 tiene un parámetro de salida, no sé cómo lo invocan. Ayuda!

Respuesta

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

Invoca un método con un parámetro de salida por reflexión como cualquier otro método. La diferencia es que el valor devuelto se copiará de nuevo en la matriz de parámetros para que pueda acceder a él desde la función de llamada.

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

La primera línea cann't ser compilado. – ldp615

+4

Hombre, eres el mejor! – Luca

+0

¿Qué pasaría si hay otro método sobrecargado? ------- 1 -------- int test (int i, cadena de salida s) { s = ""; return 0; } -------------- y ----------- int test (int i) { return 0; } – MrClan

Cuestiones relacionadas