2010-04-01 12 views
13

Come si crea un'azione in un ciclo? per spiegare (scusate è così lunga)come combinare più azioni <T> in una singola azione <T> in C#?

Ho il seguente:

public interface ISomeInterface { 
    void MethodOne(); 
    void MethodTwo(string folder); 
} 

public class SomeFinder : ISomeInterface 
{ // elided 
} 

e una classe che utilizza il sopra:

public Map Builder.BuildMap(Action<ISomeInterface> action, 
          string usedByISomeInterfaceMethods) 
{ 
    var finder = new SomeFinder(); 
    action(finder); 
} 

mi può chiamare con uno di questi e funziona great:

var builder = new Builder(); 

var map = builder.BuildMap(z => z.MethodOne(), "IAnInterfaceName"); 
var map2 = builder(z => 
        { 
        z.MethodOne(); 
        z.MethodTwo("relativeFolderName"); 
        }, "IAnotherInterfaceName"); 

Come è possibile creare la seconda implementazione a livello di codice? vale a dire,

List<string> folders = new { "folder1", "folder2", "folder3" }; 
folders.ForEach(folder => 
       { 
       /* do something here to add current folder to an expression 
        so that at the end I end up with a single object that would 
        look like: 
        builder.BuildMap(z => { 
            z.MethodTwo("folder1"); 
            z.MethodTwo("folder2"); 
            z.MethodTwo("folder3"); 
            }, "IYetAnotherInterfaceName"); 
       */ 
       }); 

ho pensato ho bisogno di un

Expression<Action<ISomeInterface>> x 

o qualcosa di simile, ma per la vita di me, io non sto vedendo come costruire quello che voglio. Ogni pensiero sarebbe molto apprezzato!

risposta

22

E 'davvero facile, perché i delegati sono già multicast:

Action<ISomeInterface> action1 = z => z.MethodOne(); 
Action<ISomeInterface> action2 = z => z.MethodTwo("relativeFolderName"); 
builder.BuildMap(action1 + action2, "IAnotherInterfaceName"); 

Oppure, se hai una collezione di loro per qualche motivo:

IEnumerable<Action<ISomeInterface>> actions = GetActions(); 
Action<ISomeInterface> action = null; 
foreach (Action<ISomeInterface> singleAction in actions) 
{ 
    action += singleAction; 
} 

O anche:

IEnumerable<Action<ISomeInterface>> actions = GetActions(); 
Action<ISomeInterface> action = (Action<ISomeInterface>) 
    Delegate.Combine(actions.ToArray()); 
+0

Grazie per la rapida risposta! Ci sto provando ora, ma sembra buono finora. – JohnKeller

+0

Questo ha fatto il trucco, grazie! Un ottimo promemoria per pensare prima a soluzioni semplici! – JohnKeller

+1

Questo è così bello. Non avevo davvero capito cosa fossero i delegati multicast fino a poco tempo fa. –

Problemi correlati