2009-07-31 9 views
1

Ich habe eine Methode, die wie folgt erklärt:Regulärer Ausdruck zum Ändern der Delegatensyntax in Lambda-Ausdruck?

public ButtonObject CreateStandardButton(type1 arg1, type2 arg2, 
         ItemClickEventHandler eventHandler, type3 arg3, type4 arg4) 

ItemClickEventHandler hat die üblichen (Absender, e) Argumente. Allerdings haben wir beendet nie die (Absender, e) mit bis Argumente, so haben wir eine Reihe von Anrufen wie folgt aus:

myButton = CreateStandardButton(myArg1, myArg2, 
       (sender, e) => MyButtonClick(), myArg3, myArg4); 

und, weil dieses Projekt auf .NET 3.5 über 15% der Art und Weise aufgerüstet wurde durch , viele Anrufe wie folgt aus:

myButton = CreateStandardButton(myArg1, myArg2, 
       delegate { MyButtonClick(); }, myArg3, myArg4); 

Wir nennen diese Methode viel, also ist es wirklich ärgerlich, den Lambda für nicht verwendete Argumente immer und immer zu haben, hinzuzufügen. Daher möchte ich diese Überlastung alle Verwendungen ändern:

public ButtonObject CreateStandardButton(type1 arg1, type2 arg2, 
         Action eventHandler, type3 arg3, type4 arg4) 

Was uns diese stattdessen tun können:

myButton = CreateStandardButton(myArg1, myArg2, 
       MyButtonClick, myArg3, myArg4); 

Das Problem ist, dass die Gebräuche der alten Delegierten Syntax eine Besetzung erfordern würde (Action), weil sie für den Compiler mehrdeutig sind. Um den Ärger zu beseitigen, möchte ich einen Fund machen und ersetzen, vermutlich mit regulären Ausdrücken.

Was ist der reguläre Ausdruck dafür?

Antwort

1

Leider wird es Ihnen schwer fallen, einen regulären Ausdruck zu finden, der die Arbeit erledigt. Um einen Delegate-Ausdruck in C# korrekt abzugleichen, muss die Engine für reguläre Ausdrücke den Begriff der Rekursion unterstützen, da der Klammerabgleich beteiligt ist. Selbst mit Rekursion sind solche Regexes in der Regel ziemlich schwierig zu bekommen.

Abhängig von der Größe Ihres Projekts kann es schnell passieren, dass Sie nur die Änderung vornehmen und die Delegiertenfunktionen zu einem Kompilierungsfehler machen und diese schnell beheben. Es ist ärgerlich, wird aber wahrscheinlich schneller und genauer als der Versuch sein, einen richtigen Regex-Ersatz zu definieren.

+0

Ich glaube nicht, dass er den vollständigen Delegate Ausdruck übereinstimmen muss. Er muss nur das 'delegate' Schlüsselwort selbst abgleichen, der Teil in geschweiften Klammern kann so bleiben wie er ist (es wird nur eine Anweisung Lambda). –

+0

@Pavel, stimmt, aber die Frage hat die vollständige Konvertierung angegeben. – JaredPar

+0

Danke für die ausgezeichnete Antwort, Jared. Ich dachte über die Möglichkeit nach, wollte aber sicherstellen, dass es mit einem regulären Ausdruck nicht einfach war. Es ist wahrscheinlich ein risikoarmer Fix, um sie in Compiler-Fehler umzuwandeln und manuell zu reparieren. –