2016-09-09 7 views
1

Ich habe eine Menge von Funktionen, die wie folgt aussehen:Passing-Funktionen mit einer unterschiedlichen Anzahl und Arten von Parametern

public void DoParticularThing(RecurringTaskRunResult result) { 
     try { 
      // Do a bunch of stuff 
     } 
     catch (Exception e) { 
      result.Succeeded = false; 
      result.Results += e.ToString(); 
      db.SaveChanges(); 
     } 
    } 

Also beschloss ich, das von DRY-Code im Namen zu extrahieren:

public void RunThing(Action<RecurringTaskRunResult> action, RecurringTaskRunResult result) { 
     try { 
      action(result); 
     } 
     catch (Exception e) { 
      result.Succeeded = false; 
      result.Results += e.ToString(); 
      db.SaveChanges(); 
     } 
    } 

So kann ich DoParticularThing wie folgt aufrufen können:

RunThing(DoParticularThing, result); 

Aber einige meiner Funktionen auch anot akzeptieren ihr Parameter:

Wie kann ich RunThing ändern, um optional einen anderen Parameter zu akzeptieren?

+0

eine Überlastung hinzufügen. DRYMTYHT. Oder TROCKEN, aber geh nicht über Bord. –

+2

@EdPlunkett Das mache ich jetzt, aber es scheint ein Schritt in die andere Richtung zu sein: p – SB2055

+0

Nun, Sie könnten eine Methode schreiben, die jede beliebige Aktion in einem try/catch aufruft. –

Antwort

1

Vielleicht ist dies:

public void RunThing(Action action, RecurringTaskRunResult result) { 
    try { 
     action(); 
    } 
    catch (Exception e) { 
     result.Succeeded = false; 
     result.Results += e.ToString(); 
     db.SaveChanges(); 
    } 
} 

RunThing(() => DoParticularThing(result), result); 
RunThing(() => DoSomethingElse(result, list), result); 
+0

Können Sie erklären, wie das funktioniert? Das ist fantastisch. – SB2055

+0

Diese Arbeit wegen der Verschlüsse in C# – VMAtm

0

Sie können Parameter verwenden, um alle Parameter in Ihrer Funktion zu akzeptieren.

public void RunThing(Action<RecurringTaskRunResult> action, RecurringTaskRunResult result, params object[] list) { 
    try { 
     action(result); 
     foreach(var item in list) 
     { 
      // Do action with your additional parameter 
     } 
    } 
    catch (Exception e) { 
     result.Succeeded = false; 
     result.Results += e.ToString(); 
     db.SaveChanges(); 
    } 
} 
0

Es sieht aus wie in allen Fällen Sie RunThing Zugriff haben auf die RecurringTaskRunResult wollen, so dass Sie einige Felder auf sie einstellen können, sondern dass Sie den Zugriff auf alle anderen Parameter nicht benötigen. Man könnte so etwas wie dies versuchen:

void Action1(RecurringTaskRunResult result) { } 
void Action2(RecurringTaskRunResult result, object foo) { } 

RecurringTaskRunResult result = ...; 
object foo = ...; 
RunThing(Action1, result); 
RunThing(res => Action2(res, foo), result); 
Verwandte Themen