【问题标题】:How can I invoke a method with an out parameter?如何调用带有 out 参数的方法?
【发布时间】:2010-03-13 10:51:57
【问题描述】:

我想公开 WebClient.DownloadDataInternal 方法,如下所示:

[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有一个out参数,不知道怎么调用。 帮助!

【问题讨论】:

    标签: c# reflection out-parameters


    【解决方案1】:

    您可以像任何其他方法一样通过反射调用带有 out 参数的方法。不同之处在于返回的值将被复制回参数数组,以便您可以从调用函数中访问它。

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

    【讨论】:

    • 第一行无法编译。
    • 如果再有一个重载方法会怎样??? -------1-------- int test(int i, out string s) { s = "";返回0; } -------------- 和 ------------ int test(int i) { return 0; }
    • 如果您使用的Invoke 版本需要传递类型参数,那么请务必使用Type.MakeByRefType 实例方法作为输出参数。 (这里不相关,但在我的情况下!)
    • 您可以先选择该类型的重载(使用Type::GetMethods 等),然后从其MethodInfo::Invoke 调用特定方法。保存重载、参数类型列表等问题。此外,您还可以将方法解析错误与调用错误分开——如果 smth 出错,那就太好了。
    【解决方案2】:
    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);
        }
    }
    

    【讨论】:

    • @JaredPar 的准系统解决方案的语法糖。干净且对可读性和测试有用。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    相关资源
    最近更新 更多