2009-07-31 70 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