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

在 ASP.NET 3.0 和 3.5 中使用泛型扩展方法。

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2013 年 10 月 11 日

CPOL

5分钟阅读

viewsIcon

6937

自 ASP.NET 问世以来,基于 Web 的开发变得更加容易。它提供了对设计和代码的极大控制。并且赋予

自 ASP.NET 问世以来,基于 Web 的开发变得更加容易。它提供了对设计和代码的极大控制。并且赋予了开发人员对其业务逻辑更多的控制权;而不是陷入使用旧脚本语言的粗糙之中。

微软不断改进它——改进基于 Web 的开发过程。我最喜欢微软技术的地方是:它们具有高度的可重用性和灵活性。所以现在,不浪费更多时间,我将直接进入主题:在 ASP.NET 中使用扩展方法。

我假设大多数读者至少听说过扩展方法;但是,这里简要介绍一下扩展方法。

“扩展方法是一种非常巧妙设计的工具,可以为任何可重复用于各种情况和场景的特定场景创建更具意义和可重用性的代码。它们是包含一个或多个静态方法的静态类,这些方法可以直接注入到所需对象中以实现特定目的。”

我不会解释它为什么以及如何可重用,尽管我将展示一个示例,该示例将解释我对扩展方法的定义。

举个例子,你有一个多选列表框,你可以从中选择多个项目。这是你对任何列表框所能做到的最好。但每次你这样做时,为了找到选定的项目,你都必须遍历列表框的所有项目。这可能是一个条件,即你需要以某种定义的数据类型(如字符串、整数、浮点数、双精度数、日期时间等)获取选定的项目数组。
现在你可能会说我可以使用泛型来实现这一点,为什么我需要使用扩展方法?所以答案如下。在当今的 IT 开发时间线上,时间总是有限的,而工作量却在不断增加,正如项目经理总是说的,“这可以在 5 分钟内完成!”,但他们从不告诉 HOW?。在这样的情况下,开发人员就像一头牛一样工作,日复一日,而且大多数时候我们都会冗余代码,并打一些补丁来完成目标。但我们从没想过,我们写的代码越多,管理起来就需要越多的时间。

好了,闲话少说。现在摆脱了我项目经理的困境,这里有一个使用泛型的扩展方法的简单示例。

所以,我在这里试图创建一个方法,该方法可以以我想要的任何数据类型格式,将任何列表框的所有选定项目以数组形式返回给我。

所以,首先创建一个包含一些字符串值的列表框,或者从下面复制。

<asp:ListBox ID="ListBox1" runat="server" SelectionMode="Multiple" >
        <asp:ListItem>India</asp:ListItem>
        <asp:ListItem>Australia</asp:ListItem>
        <asp:ListItem>Spain</asp:ListItem>
        <asp:ListItem>Denmark</asp:ListItem>
        <asp:ListItem>Egypt</asp:ListItem>
        <asp:ListItem>Qatar</asp:ListItem>
        <asp:ListItem>Nepal</asp:ListItem>
        <asp:ListItem>China</asp:ListItem>
        <asp:ListItem>Brazil</asp:ListItem>
    </asp:ListBox>

正如你所见,我有一个 ID 为 ListBox1 的列表框,其选择模式为 Multiple。
因此,在运行时,我可以选择一个或多个国家,或者全部选择,我的要求是获取所有选定的项目并放入字符串数组中。

现在创建一个类,或者在 aspx 的代码隐藏文件中,在同一个命名空间下复制并粘贴下面的代码。
////////////////////////////
public static class ControlExtentions
    {
        // 使用 ListBox 类将此方法注入 ListBox 类
        // 使用 <T> 将结果数组获取为所需的格式
 public static T[] ToListArray<T>(this ListBox control) where T : IConvertible
        {
            // 在本地变量 newList(类型为 var)中创建 T 类型的 List Array 对象
            var newList = new List<T>();
     // 现在遍历此列表框的所有项目
            foreach (ListItem li in control.Items)
            {
               // 检查每个项目是否被选中

               if (li.Selected)
                {
  `   // 如果选中,则将当前选定项目的 Text 类型更改为 T 类型,并
         将其添加到 newList 中。
                    newList.Add((T)Convert.ChangeType(li.Text, typeof(T)));
               
                }

            }
     // 最后,将 List 返回为 Array 格式
            return newList.ToArray();
        }

    }
}
//////////////////////////

上面的方法是如何工作的,这是相当容易和简单的理解,嗯,你也可以通过代码注释来理解。
现在如何使用它。
由于我在这里使用了同一个命名空间下的类来演示逻辑,所以我们不必为此添加任何命名空间,但强烈建议你将方法放在一个单独的类中,这样这个方法的范围就会增加。然后你只需要在你的代码隐藏文件中使用这个命名空间。

好的,是的,我刚才在说如何使用它。
现在,在你的 aspx 中创建一个按钮,并在其 postback 事件中尝试使用下面提供的代码。

string[] selectedCountries= ListBox1.ToListArray<string>();

你会发现,你的 Listbox 控件不仅知道 ToListArray<T>() 方法是谁,它也知道当你调用这个方法时会产生什么输出。

现在为了进一步测试……添加另一个 Listbox 并用 Datetime 填充它。
那么你唯一需要更改的代码就是这个:

DateTime[] selectedCountries= ListBox1.ToListArray<DateTime>();

现在再次测试。
所以结论是,通过使用 .net 的这项新功能,我们可以减少无谓编码的精力,并实际编写一些有用的代码,这些代码将更具通用性和可重用性。
我希望你们这些刚接触扩展方法的人能够写出更好、更具可重用性的代码。
注意:如果你写了一些好的东西,请与我们分享。
暂时先这样 :)

 

© . All rights reserved.