Search code examples
c#reflectionout-parameters

How can I invoke a method with an out parameter?


I want expose WebClient.DownloadDataInternal method like below:

[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 has a out parameter, I don't know how to invoke it. Help!


Solution

  • 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);
        }
    }