Frage

Als ich Verwendung params in einem Aktionsdelegate bin versucht ...

private Action<string, params object[]> WriteToLogCallBack;

ich diesen Entwurf Zeitfehler erhalten:

  

Ungültige token 'params' in Klasse, Struktur oder Interface-Memberdeklaration

Jede Hilfe!

War es hilfreich?

Lösung

Wie wäre es dieses Problem zu umgehen?

private Action<string, object[]> writeToLogCallBack;
public void WriteToLogCallBack(string s, params object[] args)
{
  if(writeToLogCallBack!=null)
    writeToLogCallBack(s,args);
}

Oder Sie könnten Ihre eigene Delegattyp definieren:

delegate void LogAction(string s, params object[] args);

Andere Tipps

Variadische Typparameter sind nicht möglich in C #.

Deshalb moment gibt es viele Erklärungen für Action<...>, Func<...> und Tuple<...>, zum Beispiel. Es wäre ein interessantes Feature, obwohl sein. C ++ 0x hat sie .

Sie können dies versuchen. Es ermöglicht eine beliebige Anzahl von Argumenten, und Sie werden eine Kompilierung Fehlermeldung erhalten, wenn Sie die falsche Anzahl oder Art der Argumente übergeben.

public delegate T ParamsAction<T>(params object[] oArgs);

public static T LogAction<T>(string s, ParamsAction<T> oCallback)
{
    Log(s);
    T result = oCallback();
    return T;
}

Foo foo = LogAction<Foo>("Hello world.", aoArgs => GetFoo(1,"",'',1.1));

Sie können params in der eigentlichen Erklärung eines Delegierten verwenden, aber nicht in der Art von einem. Die allgemeinen Parameter auf eine Aktion sind nur Typen, nicht die eigentlichen Argumente übergeben werden, wenn der Delegat aufgerufen wird. params ist kein Typ, ist es ein Schlüsselwort ist.

Ich habe eine kleine Erweiterung des obigen Code von Bryan getan, um zu zeigen, wie mehrere Methodenaufrufe wickeln.
Ich verwende diese mehrere Methoden zu wickeln, die Datenbankaufrufe enthalten, in einer einzigen Transaktion.
Dank Bryan :-)
(Sie können die folgenden in LINQPad zu Testlauf)

//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  
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top