私は現在、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;
}
現時点では、これは 1 つの引数を持つ関数に対してのみ機能し、より一般的にできるかどうか疑問に思っていました (配列をメソッドにアンパックする方法があるかどうか)。
(これに沿った何か?)
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;
}
TArgs は TArg[] です。