Closed 。这个问题是基于意见的 /help/closed-questions 。目前不接受答案。
我正在看MvcContrib http://www.codeplex.com/MVCContrib 网格组件,我对其中使用的语法技巧着迷,但同时又感到排斥网格语法 http://www.jeremyskinner.co.uk/2009/02/22/rewriting-the-mvccontrib-grid-part-2-new-syntax/ :
.Attributes(style => "width:100%")
上面的语法将生成的 HTML 的 style 属性设置为width:100%
。现在如果你注意的话,“风格”没有被指定。它是从name 表达式中的参数!我必须深入研究这一点并找到“魔法”发生的地方:
Hash(params Func<object, TValue>[] hash)
{
foreach (var func in hash)
{
Add(func.Method.GetParameters()[0].Name, func(null));
}
}
事实上,代码正在使用正式的编译时参数名称来创建属性名称-值对的字典。由此产生的语法结构确实非常具有表现力,但同时也非常危险。
lambda 表达式的一般使用允许替换names 使用无副作用。我在一本书上看到一个例子,上面写着collection.ForEach(book => Fire.Burn(book))
我知道我可以写我的代码collection.ForEach(log => Fire.Burn(log))
and 这意味着同样的事情 。但是突然间有了 MvcContrib Grid 语法,我发现代码可以根据我为变量选择的名称主动查找并做出决策!
那么这是 C# 3.5/4.0 社区和 lambda 表达式爱好者的常见做法吗?或者是一个我不应该担心的流氓一招特立独行者?
我觉得这不太奇怪,因为name ,但是因为lambda 是不必要的 ;它可以使用匿名类型并且更加灵活:
.Attributes(new { style = "width:100%", @class="foo", blip=123 });
这是在 ASP.NET MVC 的大部分(例如)中使用的模式,并且具有其他用途 http://marcgravell.blogspot.com/2009/10/pass-data-simply-learning-from-jquery.html (a caveat http://marcgravell.blogspot.com/2009/10/anonymous-type-tricks-clarification.html ,还请注意阿延德的想法 http://ayende.com/Blog/archive/2009/10/14/what-is-up-with-the-entity-framework-vnext.aspx 如果名称是一个魔法值而不是特定于调用者的值)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)