我正在研究MvcContrib的网格组件,对于在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表达式爱好者常见的做法吗?还是一个流氓的技巧,我不必担心?