Action デリゲートで params を使用しようとすると...
private Action<string, params object[]> WriteToLogCallBack;
この設計時エラーを受け取りました:
クラス、構造体、またはインターフェイス メンバー宣言のトークン 'params' が無効です
どんな助けでも!
Action デリゲートで params を使用しようとすると...
private Action<string, params object[]> WriteToLogCallBack;
この設計時エラーを受け取りました:
クラス、構造体、またはインターフェイス メンバー宣言のトークン 'params' が無効です
どんな助けでも!
この回避策はどうですか?
private Action<string, object[]> writeToLogCallBack;
public void WriteToLogCallBack(string s, params object[] args)
{
if(writeToLogCallBack!=null)
writeToLogCallBack(s,args);
}
または、独自のデリゲート タイプを定義することもできます。
delegate void LogAction(string s, params object[] args);
C# では可変個引数は使用できません。
そのため、たとえばAction<...>
、Func<...>
、およびの宣言が多数あります。Tuple<...>
しかし、それは興味深い機能です。C++0xにはそれらがあります。
params
デリゲートの実際の宣言では使用できますが、型では使用できません。Action へのジェネリック パラメーターは単なる型であり、デリゲートを呼び出すときに渡される実際の引数ではありません。params は型ではなく、キーワードです。
複数のメソッド呼び出しをラップする方法を示すために、Bryan からの上記のコードに小さな拡張を行いました。
これを使用して、データベース呼び出しを含む複数のメソッドを単一のトランザクションにラップしています。
ありがとうBryan :-)
(LINQPadで以下を実行してテストできます)
//Wrapper code
public delegate void MyAction(params object[] objArgs);
public static void RunActions(params MyAction[] actnArgs)
{
Console.WriteLine("WrapperBefore: Begin transaction code\n");
actnArgs.ToList().ForEach( actn => actn() );
Console.WriteLine("\nWrapperAfter: Commit transaction code");
}
//Methods being called
public void Hash (string s, int i, int j) => Console.WriteLine(" Hash-method call: " + s + "###" + i.ToString() + j.ToString());
public void Slash (int i, string s) => Console.WriteLine(" Slash-method call: " + i.ToString()+ @"////" + s);
//Actual calling code
void Main()
{
RunActions( objArgs => Hash("One", 2, 1)
,objArgs => Slash(3, "four") );
}
//Resulting output:
//
// WrapperBefore: Begin transaction code
//
// Hash-method call: One###21
// Slash-method call: 3////four
//
// WrapperAfter: Commit transaction code