我正在查看版 Grid组件,我被网格的语法中使用的语法技巧所吸引,但同时又被排斥:
.Attributes(style => "width:100%")
上面的语法将生成的HTML的样式属性设置为width:100%
。如果你注意的话,'style'并没有被指定。它是从表达式中参数的的名字推导出来的!我必须深入研究这个问题,找到“魔法”发生的地方:
Hash(params Func<object, TValue>[] hash)
{
foreach (var func in hash)
{
Add(func.Method.GetParameters()[0].Name, func(null));
}
}
因此,代码确实使用了正式的、编译时的参数名称来创建属性名称-值对的字典。生成的语法结构确实非常具有表现力,但同时也非常危险。
lambda表达式的一般用法允许替换所使用的的名字而不产生副作用。我在一本书中看到一个例子,上面写着collection.ForEach(book => Fire.Burn(book))
,我知道我可以在我的代码中写collection.ForEach(log => Fire.Burn(log))
和意思是一样的。但是使用这里的MvcContrib Grid语法,我突然发现代码可以根据我为变量选择的名称主动查找并做出决定!
那么这是c# 3.5/4.0社区和lambda表达式爱好者的普遍做法吗?还是说,我不应该担心一个流氓的诡计特立独行?