【问题标题】:Converting a DataRow to a single object - type constraints将 DataRow 转换为单个对象 - 类型约束
【发布时间】:2015-06-24 07:17:46
【问题描述】:

我有以下实现,可用于将DataTable 中的行转换为List<T>IDataItem 接口只包含 SetData 方法,该方法接受单个 DataRow 对象。

public class GroupedData<T> : List<T> where T : IDataItem, new()
    {
        public GroupedData(DataTable table)
        {
            for (int i = 0; i < table.Rows.Count; i++)
            {
                DataRow row = table.Rows[i];
                var newItem = new T();
                newItem.SetData(row);
                Add(newItem);
            }
        }
    }

这些是我试图为其赋值的类中的属性:

  public class Details
  {
    public List<AuditData> AuditEntries { get; set; }

    public AuditMethodSummaryData AuditMethodSummaryData { get; set; }
  }

使用 GroupedData 类,我可以执行以下操作来填充 AuditEntries:

var returnData = new Details();
returnData.AuditEntries = new GroupedData<AuditData>(dataSet.Tables[TableNames.AuditDetails]);

对于第二个属性 AuditMethodSummaryData。我需要分配一个对象而不是一个列表。我不知道如何创建另一个可以执行该功能的类。

注意 - 我仍然需要传入一个 DataTable。但是,数据表将永远只包含一行(由于系统的工作方式)。

我想出的唯一解决方案如下。我就是想看看有没有更好的解决方案:

public class SingleData
  {
    public static T GetItem<T>(DataTable table) where T : IDataItem, new()
    {
      if (table.Rows.Count >= 1)
      {
        DataRow row = table.Rows[0];
        var newItem = new T();
        newItem.SetData(row);
      }
    }
  }

我不喜欢的是我将约束从类移到了方法上。有没有办法让我在课堂上保留它?避免使用静态方法。

【问题讨论】:

  • 使用泛型方法代替类有什么问题?我只能看到好处,真的......
  • @Luaan 这是一个公平的观点。这也是我坚持生产代码的原因。谢谢。

标签: c# oop generics type-constraints


【解决方案1】:

好吧,对于单个项目,您根本不需要泛型:

public class SingleItem : IDataItem
{
  public SingleItem(DataTable table)
  {
    if (table.Rows.Count >= 1)
    {
      var row = table.Rows[0];
      SetData(row);
    }
    else
    {
      throw new ArgumentException("No rows.", "table");
    }
  }

  public abstract void SetData(DataRow row);
}

public AuditMethodSummaryData : SingleItem
{
  public AuditMethodSummaryData(DataTable table) : base(table)
  {}
  public override void SetData(DataRow row) { /*...*/ }
}

当您需要为零行返回 null 时,这仍然不能解决问题。在这种情况下,您必须使用工厂模式 - 可以通过各种方式实现 - 静态方法很容易,我认为适合您的情况;如果您不想使用静态方法,则必须创建工厂类,例如:

public class DataItemFactory<T> where T : IDataItem, new()
{
  private readonly DataTable m_Table;

  public DataItemFactory(DataTable table)
  {
    m_Table = table;
  }

  public T Create()
  {
    T result = default(T);
    if (m_Table.Rows.Count > 1)
    {
      result = new T();
      result.SetData(m_Table.Rows[0]);
    }
    return result;
  }
}

用法如下:

returnData.AuditMethodSummaryData =
  new DataItemFactory<AuditMethodSummaryData>(table).Create();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多