将<widget>转换或转换为Widgets类</widget>

时间:2014-02-20 16:48:13

标签: c# asp.net generics generic-list generic-collections

情境:

我正在维护一个大型ASP.NET应用程序,其中所有方法都返回一个通用列表。这导致的主要问题是ObjectDataSource不支持返回通用列表的方法。

我要做的是:

想出一种使用ObjectDataSource的方法,而无需重写现有方法。我已经包含了一种有效的技术,但想知道是否有更好的方法。

我理解我正在尝试的任何方法都会对性能产生负面影响。我主要担心的是减少维护和增强此应用程序所需的时间。但是,我想实施一种对性能影响最小的方法。

返回通用列表的方法示例

    public static List<Widget> GetAll()
    {
        List<Widget> temp = new List<Widget>();

        Widget w1 = new Widget();
        w1.Name = "test 1";
        Widget w2 = new Widget();
        w2.Name = "test 2";

        temp.Add(w1);
        temp.Add(w2);

        return temp;
    }

以下有效,但我不确定这是最好的方法,因为它需要迭代列表项

public class Widgets : List<Widget>
{
    public Widgets()
    {}
}


public static Widgets GetAll2()
{
   List<Widget> temp = WidgetManager.GetAll();
   Widgets widgets = new Widgets();
   foreach (Widget widget in temp)
   {
      widgets.Add(widget);
   }
   return widgets;
}

以下内容不起作用。

public class Widgets : List<Widget>
{
    public Widgets()
    {}
}

public static Widgets GetAll2()
{
   List<Widget> tempWidgets1 = GetAll();
   Widgets tempWidgets2 = (Widgets)tempWidgets1;
   return tempWidgets2;
}

以下是基于答案和答案的完整解决方案。评论由KMP&amp; korhner上面的一些代码是重复的,但有更多细节。

使这项工作的关键是将以下构造函数添加到实体列表类。除了添加构造函数之外,不需要额外的代码来实现IEnumerable。

public Widgets(IEnumerable collection) : base(collection) { }

数据访问层

请注意,数据访问层返回一个不能与ObjectDataSource一起使用的List。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DemoClassLibrary.Entities;

namespace DemoClassLibrary.DAL
{
    public class WidgetDAL
    {
        public static List<Widget> GetAll()
        {
            List<Widget> temp = new List<Widget>();

            Widget w1 = new Widget();
            w1.Name = "test 1";
            Widget w2 = new Widget();
            w2.Name = "test 2";

            temp.Add(w1);
            temp.Add(w2);

            return temp;
        }
    }
}

实体

不需要对实体类进行任何更改。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DemoClassLibrary.Entities
{
    public class Widget
    {
        public string Name
        {
            get;
            set;
        }
    }
}

实体列表类

需要创建实体列表类才能使用ObjectDataSource。我的一个关键要求是原始DAL无法修改。然而,DAL仍然需要用于填充实体列表类。完成这项工作的关键是添加以下构造函数。

public Widgets(IEnumerable collection):base(collection){}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DemoClassLibrary.Entities.Collections
{
    public class Widgets : List<Widget>
    {
        public Widgets(IEnumerable<Widget> collection) : base(collection) { }

        public Widgets()
        { }
    }
}

业务逻辑层

使业务逻辑层工作的关键是实例化Widgets类。这有效地将List<Widget>转换为Widgets

小部件tempWidgets2 =新小部件(tempWidgets1)

using System.ComponentModel;
using DemoClassLibrary.DAL;
using DemoClassLibrary.Entities;
using DemoClassLibrary.Entities.Collections;

namespace DemoClassLibrary.BLL
{
    [DataObjectAttribute()]
    public class WidgetManager
    {
        public static Widgets GetAll()
        {
            List<Widget> tempWidgets1 = WidgetDAL.GetAll();
            Widgets tempWidgets2 = new Widgets(tempWidgets1);
            return tempWidgets2;
        }
    }
}

ASPX页面

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"    Inherits="DemoWebApplication._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
        DataSourceID="ObjectDataSource1">
            <Columns>
                <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
            </Columns>
        </asp:GridView>
        <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
        OldValuesParameterFormatString="original_{0}" SelectMethod="GetAll" 
        TypeName="DemoClassLibrary.BLL.WidgetManager"></asp:ObjectDataSource>
    </div>
    </form>
</body>
</html>

1 个答案:

答案 0 :(得分:1)

您可以在Widgets类中实现一个带有参数的构造函数:

public Widgets(IEnumerable<Widget> collection) : base(collection) { }

你可以用这种方式实例化它:

List<Widget> tempWidgets1 = GetAll();
Widgets tempWidgets2 = new Widgets(tempWidgets1);