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 [].
您可以使用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)
这很好,因为它允许任意数量的参数而不会有多个重载.