你能编写可以接受任意数量参数的ac#decorator函数吗?

Sam*_*lis 3 c# decorator wrapper

我目前的代码与python装饰器非常相似,它将函数作为参数并返回由另一个函数包装的相同函数(在这种情况下打开和关闭perforce连接).

    public Func<TArg, TReturn> EnableP4<TReturn, TArgs>(Func<TArg, TReturn> function)
    {
        Func<TArg, TReturn> p4Wrapper = (TArg funcArg) =>
        {
            try
            {
                if (con.Status.Equals(ConnectionStatus.Disconnected)) { con.Connect(options); }
                return function(funcArg);
            }
            finally { con.Disconnect(); }
        };
        return p4Wrapper;
    }
Run Code Online (Sandbox Code Playgroud)

目前这只适用于带有一个参数的函数,我想知道它是否可以更通用(也许是否有一种方法可以将数组解压缩到方法中?).

(有什么东西沿着这个?)

    public Func<TArgs, TReturn> EnableP4<TReturn, TArgs>(Func<TArgs, TReturn> function)
    {
        Func<TArgs, TReturn> p4Wrapper = (TArgs args) =>
        {
            try
            {
                if (con.Status.Equals(ConnectionStatus.Disconnected)) { con.Connect(options); }
                return function(*args);
            }
            finally { con.Disconnect(); }
        };
        return p4Wrapper;
    }
Run Code Online (Sandbox Code Playgroud)

其中TArgs是TArg [].

Ree*_*sey 6

您可以使用Func<T>(不Func<TArg,TResult>),并允许编译器通过lambda表达式中的闭包来处理多个参数.

如果您将方法更改为:

public Func<T> EnableP4<T>(Func<T> function)
Run Code Online (Sandbox Code Playgroud)

您可以随时通过以下方式调用它

var newFunc = EnableP4(() => SomeFunc(arg1, arg2, arg3));
Run Code Online (Sandbox Code Playgroud)

这很好,因为它允许任意数量的参数而不会有多个重载.