2010-03-13 11 views
37

chcę narazić metodę WebClient.DownloadDataInternal jak poniżej:Jak mogę wywołać metodę z parametrem 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 ma parametr wyjściowy, nie wiem, jak ją wywołać. Pomoc!

Odpowiedz

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

Przywołujesz metodę z parametrem out za pomocą odbicia, jak każdą inną metodę. Różnica polega na tym, że zwrócona wartość zostanie skopiowana z powrotem do tablicy parametrów, dzięki czemu można uzyskać do niej dostęp z funkcji wywołującej.

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

Pierwsza linia cann't być skompilowany. – ldp615

+4

Człowieku, jesteś najlepszy! – Luca

+0

co by się stało, gdyby istniała inna przeciążona metoda? ------- 1 -------- test int (int, out string s) { s = ""; return 0; } -------------- i ----------- int test (int i) { return 0; } – MrClan