65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Lambda 表达式的 Databinder.Eval

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (5投票s)

2010 年 4 月 7 日

CPOL
viewsIcon

25624

使用 lambda 表达式来帮助编译时检查 Eval 语句

引言

我们都做过,并且都知道处理魔术字符串可能会令人沮丧。虽然修复或规避起来并不困难,但 Databinder.Eval("") 方法需要使用字符串才能工作。然而,使用一些扩展方法(或辅助类)可以消除对这些魔术字符串的依赖,并允许您的代码使用 lambda 表达式。

Using the Code

public static class ExtensionMethods
{
    public static string Evaluate<T>(this ListViewItem item, 
	Func<T, object> expression)
    {
        var result = expression((T)item.DataItem);
        if (result != null)
            return result.ToString();
        return null;
    }

    public static TOutput Evaluate<T, TOutput>
	(this ListViewItem item, Func<T, TOutput> expression)
    {
        return (TOutput)expression((T)item.DataItem);
    }
}		 

因此,有了这些,您可以不用如下所示的代码:

 <asp:GridView ID="gvName" runat="server" AutoGenerateColumns="False" 
        HorizontalAlign="Center">
      <Columns> 
          <asp:TemplateField HeaderText="County Name">               
              <ItemTemplate>
                  <%# Eval("County.Name") %>
              </ItemTemplate>
          </asp:TemplateField>            
      </Columns>
 </asp:GridView> 

而是使用更冗长,但更稳定的 lambda 版本:

 <asp:GridView ID="gvName" runat="server" AutoGenerateColumns="False" 
	HorizontalAlign="Center">
   <Columns> 
     <asp:TemplateField HeaderText="County Name">               
       <ItemTemplate>
         <%# Container.Evaluate<AddressEntity>(c=>c.County.Name) %> 
       </ItemTemplate>
     </asp:TemplateField>            
   </Columns>
</asp:GridView>  

关注点

只需记住在页面顶部或在 web.config 中包含放置代码的命名空间即可。

Evaluate 方法的第二个版本允许您将数据作为其真实类型返回,而不是将其作为 string 返回。如果您需要调用页面方法并且不想先将其转换为 string ,然后再将其转换回原始类型,这将非常有用。

<%# DoSomething(Container.Evaluate<AddressEntity, int?>(c=>c.County.CountyID)) %>   

历史

  • 2010/07/04 - 原始草稿
© . All rights reserved.