微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以将没有参数的方法分配给参数中的 Func<X>

如何解决是否可以将没有参数的方法分配给参数中的 Func<X>

是否可以将带有 out 参数的方法分配给 Func<T1,T2> 方法参数?

我可以用作参数的示例方法

public string HelloMethod(out bool success)
{
    success = true;
    return "Hello";
};

我想这样做的原因是我调用一个库,其中许多(但不是全部)方法都有 out 参数和错误代码,我想创建一个方法来用 {{ 1}} 等:

try catch log

此外,我不确定这将如何调用。 我希望是这样的:

private TResult MakeLibraryCall(...func...) // what signature?
{
    try
    {
        return func(...); // unclear how to make call with out parameter
    }
    catch(Exception error)
    {
        Log(error);
    }

    return default;
}

感谢任何帮助!

解决方法

根据 Microsoft Doc Built-in Delegate Func 其输入参数未定义为输出参数

public delegate TResult Func<in T,out TResult>(T arg);

因此您应该按如下方式定义您的自定义委托:

delegate T MyDelegate<T,TInput>(out TInput input);

然后将其设为 MakeLibraryCall 函数的参数,如下所示:

private string MakeLibraryCall(MyDelegate<string,bool> func) 
{
    try
    {
        bool x = true;
        return func(out x); 
    }
    catch(Exception e)
    {
        //Log(error);
    }

    return default;
}

之后调用函数 MakeLibraryCall 如下:

public string HelloMethod(out bool success)
{
    success = true;
    return "Hello";
};

var greeting = MakeLibraryCall(HelloMethod);

如果你想从 MakeLibraryCall 中取出 func 的参数,那么你必须将它定义为它的 out 参数,如下所示:

private string MakeLibraryCall(MyDelegate<string,bool> func,out bool success) 
    {
        try
        {
            return func(out success);  
        }
        catch(Exception e)
        {
            //Log(error);
            success = false;
        }
    
        return default;
    }

var success = false;
var greeting = MakeLibraryCall(HelloMethod,out success);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。