【问题标题】:Is it possible to assign a method with out parameter to a Func<X> in parameter是否可以将没有参数的方法分配给参数中的 Func<X>
【发布时间】:2021-01-05 15:54:36
【问题描述】:

是否可以将带有out 参数的方法分配给Func&lt;T1, T2&gt; 方法参数?

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

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

我想这样做的原因是我调用了一个库,其中许多(但不是全部)方法具有带有错误代码的 out 参数,并且我想创建一个方法来使用 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;
}

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

var greeting = MakeLibraryCall((out success) => HelloMetod(out success));

Console.WriteLine(greeting) // => Hello
Console.WriteLine(success) // => true

任何帮助表示赞赏!

【问题讨论】:

  • 这能回答你的问题吗? Func<T> with out parameter
  • @AhmedYousif:不确定如何在我的代码中实现该委托模式?它可能有效,但我不知道如何编写解决方案。
  • 你可以检查我的答案足以实现你想做的事

标签: c# func out


【解决方案1】:

根据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 的参数,那么你必须将它定义为它的输出参数,如下所示:

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

【讨论】:

  • 谢谢!我去看看,但我要到星期四才能上班
猜你喜欢
  • 2012-11-28
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 2021-03-02
相关资源
最近更新 更多