2009-07-31 53 views
1

我有被宣佈像這樣的方法:正則表達式將委託語法更改爲Lambda表達式?

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

ItemClickEventHandler具有通常的(發送者,E)的參數。但是,我們從來沒有最終使用的(發件人,E)的參數,所以我們有這樣一串電話:

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

和,因爲這個項目升級爲.NET 3.5通過的方式約15% ,許多人呼籲這樣的:

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

我們把這種方法有很多,所以它是真煩人不得不一遍又一遍地添加拉姆達未使用參數。因此,我想改變這一切慣例這個過載:

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

這使我們能夠做到這一點,而不是:

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

的問題是,舊的委託語法的用法將需要強制轉換爲(Action),因爲它們對編譯器不明確。所以,爲了消除煩惱,我想要做一個查找和替換,大概是用正則表達式。

這樣做的正則表達式是什麼?

回答

1

不幸的是,你將很難找到一個能夠完成工作的正則表達式。爲了在C#中正確匹配委託表達式,正則表達式引擎必須支持遞歸的概念,因爲涉及到大括號匹配。即使有遞歸,這些正則表達式通常也很難正確。

根據您的項目規模,只需進行更改並讓代理函數變成編譯錯誤並快速修復它們可能會很快。這很煩人,但可能會比嘗試定義正確的正則表達式替換更快,更準確。

+0

我不認爲他需要匹配完整的代表表達式。他實際上只需要匹配`delegate`關鍵字本身,大括號中的部分可以保持原樣(它將成爲語句lambda)。 – 2009-07-31 03:41:00