实现不带参数的调用委托

我尝试实现一个装饰器模式来处理数据库事务中的错误。我没有使用标准Func和Actions的问题,但是使用具有参数的函数时遇到了困难。


这里有许多问题相同的问题,我想实现自己的代表:


    public delegate TResult FuncWithOut<T1, T2, TResult>(T1 arg1, out T2 arg2);         

1)但我没有发现如何基于此委托来实现方法:


    private void SafetyExecuteMethod(Action action)

    {

        try

        {

            action();

        }

        catch (Exception ex)

        {

            // Some handling

        }

    }


    private T SafetyExecuteFunction<T>(Func<T> func)

    {

        T result = default(T);

        SafetyExecuteMethod(() => result = func.Invoke());

        return result;

    }


    private SafetyExecuteFunctionWithOut // ??

    {

        // ??

    }

2)以及如何调用此方法:


    public bool UserExists(string name)

    {

        return SafetyExecuteFunction(() => _innerSession.UserExists(name));

    }


    public void CreateUser(string name, string password)

    {

        SafetyExecuteMethod(() => _innerSession.CreateUser(name, password));

    }


    public bool CanUpdateUser(string userName, out string errorMessage)

    {

        // ??

        // _innerSession.CanUpdateUser(userName, out errorMessage);

    }


吃鸡游戏
浏览 182回答 1
1回答

慕妹3242003

只需使用与的示例相同的方案即可SafetyExecuteFunction<T>(Func<T> func)。您需要注意的一件事是,您需要为out参数使用一个临时的局部变量。private TResult SafetyExecuteFunctionWithOut<T1, T2, TResult>(FuncWithOut<T1, T2, TResult> func, T1 arg1, out T2 arg2){&nbsp; &nbsp; TResult result = default(TResult);&nbsp; &nbsp; T2 arg2Result = default(T2); // Need to use a temporary local variable here&nbsp;&nbsp; &nbsp; SafetyExecuteMethod(() => result = func(arg1, out arg2Result));&nbsp; &nbsp; arg2 = arg2Result; // And then assign it to the actual parameter after calling the delegate.&nbsp; &nbsp; return result;}调用该函数的确像这样工作:public bool CanUpdateUser(string userName, out string errorMessage){&nbsp; &nbsp; bool result = SafetyExecuteFunctionWithOut<string, string, bool>(_innerSession.CanUpdateUser, userName, out errorMessage);&nbsp; &nbsp; return result;}请注意,您必须将其_innerSession.CanUpdateUser作为参数传递给,SafetyExecuteFunctionWithOut而不是使用lambda表达式。使用幼稚的尝试:private TResult SafetyExecuteFunctionWithOut<T1, T2, TResult>(FuncWithOut<T1, T2, TResult> func, T1 arg1, out T2 arg2){&nbsp; &nbsp; TResult result = default(TResult);&nbsp; &nbsp; SafetyExecuteMethod(() => result = func(arg1, out arg2));&nbsp; &nbsp; return result;}创建错误消息:CS1628无法在匿名方法,lambda表达式或查询表达式中使用ref或out参数“ arg2”此答案中说明了为什么不允许您这样做。
打开App,查看更多内容
随时随地看视频慕课网APP