你能写一个可以接受任意数量参数的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)); 这很好,因为它允许任意数量的参数而不会有多个重载. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |