【问题标题】:Instantiating list of an object实例化对象列表
【发布时间】:2017-07-06 02:23:25
【问题描述】:

我确信这个问题之前已经回答过,但老实说我不确定如何找到答案,而且我的搜索没有产生任何结果;随时通过关闭主题并指出正确的问题/答案来回答这个问题。

假设我有一个代表我组织成员的类。该类有一个构造函数来实例化成员对象,将成员 ID 作为参数,并执行数据库调用以返回代表成员的行,以及我有兴趣使用的成员的任何属性。

获取成员列表的正确协议是什么?

我的数据库查询很简单——我有一个存储过程,它将返回我有兴趣获取的成员列表。但是我如何在应用程序级别表示呢?

现在,我有一个 Member 对象的构造函数,它将 DataRow 作为输入,并分配 Member 对象的所有相关属性。然后我正在执行以下操作:

public static List<member> getList()
{
    DataTable dt = GetMemberList();
    List<member> memberList = new List<member>()
    foreach (DataRow dr in dt.Rows) memberList.Add(new member(dr));
    return memberList;
}

【问题讨论】:

  • 这一切都取决于您所说的“正确”。
  • GetMemberList() 返回什么?这可以使用 linq 在几行代码中完成。
  • GetMemberList 正在返回一个 DataTable 对象,DataTable 中的每一行代表我的数据库中成员表中的一行。
  • 请在您的代码 sn-p 中指出您遇到问题的行。
  • 可以分享一下GetMemberList方法吗?

标签: c# list class constructor


【解决方案1】:

我不确定您的 Member(我建议您的类使用大写 M)类是什么样的,但您可以让您的类构造函数将 DataRow 作为参数并像这样填充您的属性:(我是这里假设属性名称和数据库列名称)。

public class Member
{
    public Member(DataRow dataRow)
    {
        MemberID = Convert.ToInt32(dataRow["MemberID"]);
        MemberName = Convert.ToString(dataRow["MemberName"]);
    }

    public int MemberID { get; set; }
    public string MemberName { get; set; }
}

不是最好的解决方案,但这应该适用于您提供的代码。

【讨论】:

  • 这正是我目前正在做的事情 - 但我更感兴趣的是知道我应该如何/在哪里放置代码以实际获取我正在迭代以创建每个成员对象的 DataTable
  • 阅读您的评论后,我可以就如何做到这一点提出建议。我将所有数据库调用放在返回对象列表的静态类中(在您的情况下,该方法将返回List&lt;Member&gt;。因此,不要返回DataTable,而是在方法调用中使用它来创建Member对象和将它们放在要返回的列表中。希望这会有所帮助。
【解决方案2】:

GetMemberList 在这里工作,getList 只是一个抽象。您所说的是关注点分离。这通常是在具有数据库的项目中通过分层实现的,通常称为 n 层结构。

关于您所询问的内容,此结构将包含处理数据库交互的数据访问层 (DAL);一个服务层,它能够操纵 DAL 的输入和输出,然后将该数据返回给调用者;和一个业务逻辑层,它将确定进行哪些服务调用以及如何组合返回的数据。

如何实现该结构很大程度上取决于几个因素:

  • 您的项目规模(这是针对小型企业还是针对所有人)
  • 您的团队规模(是您自己还是有很多开发人员参与其中)
  • 测试(是否有任何测试,覆盖范围有多大)
  • 有时间表(是否需要在本周完成)
  • 数据的敏感性(您是在处理财务数据吗)
  • 个人偏好(制表符或空格或代码牛仔)

最佳实践会根据这些因素的排列方式决定不同的事情。如果只有你,那么它的解释就更开放了。如果是一个团队,那么他们可能已经有了这类事情的指导方针。

我建议至少使用数据访问层和服务层。

【讨论】:

    【解决方案3】:

    你目前所做的确实没有错。

            DataTable dt = GetMemberList();
            List<Member> memberList = new List<Member>();
            foreach (DataRow dr in dt.Rows)
            {
                memberList.Add(new Member(dr));
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 2017-11-25
      相关资源
      最近更新 更多