加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

你能写一个可以接受任意数量参数的c#装饰器函数吗?

发布时间:2020-12-16 01:56:54 所属栏目:百科 来源:网络整理
导读:我目前的代码与 python装饰器非常相似,它将函数作为参数并返回由另一个函数包装的相同函数(在这种情况下打开和关闭perforce连接). public FuncTArg,TReturn EnableP4TReturn,TArgs(FuncTArg,TReturn function) { FuncTArg,TReturn p4Wrapper = (TArg funcArg
我目前的代码与 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;
    }

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

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

public Func<TArgs,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;
    }

其中TArgs是TArg [].

解决方法

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

如果您将方法更改为:

public Func<T> EnableP4<T>(Func<T> function)

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

var newFunc = EnableP4(() => SomeFunc(arg1,arg2,arg3));

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读