2017-02-20 65 views
0

我想创建一个数据表类,并且可以使用指定的列来调用方法,例如复制或聚合,我可以遍历一些记录并添加到表中。创建可重用的数据对象;仅添加迭代

我想我可以创建私人和公共变量集和表的值赋给我的默认设置,如:

private DataTable newTable; 
public DataTable NewTable 
{ 
    get { return newTable; } 
    set 
    { 
     DataTable newTable= new DT(); 
     newTable.Columns.Add("Name", typeof(string)); 
     newTable.Columns.Add("Id", typeof(int)); 
    } 
} 

我的想法是,一个人可以得到该表,但他们couldn” t设置它是因为它被设置为默认值。但是,我从界面看到一条消息,即使我稍后在方法中使用它,它将始终为空。

我真是创造,我可以在一个方法使用一个静态类,涉及以上数据表的另一种刺被设置:

static DataTable myDt() 
{ 
    DataTable myDt = new DT(); 
    myDt.Columns.Add("Name", typeof(string)); 
    myDt.Columns.Add("Id", typeof(int)); 
} 

这不工作,我需要在一个迭代的方式当有人迭代超过100K条记录时,我不希望每次创建数据表;我想用定义创建一次数据表,创建一次数据行,然后在每次迭代时,根据定义中的列名将数据添加到新行中。我的想法是,该类将有数据表定义,这将永远不会改变,并且可以在每次迭代中更改数据行并将其添加到表中。

根据我正在做的事情,我哪里会出错,或者这甚至有可能吗?

+1

最初的问题是setter没有设置私有变量,它只是产生一个新的变量,然后抛出它。所以类级别的newTable始终是null。但是这里一个更重要的设计问题是setter并没有真正设置它给出的内容,这会导致误导,并且会导致各种难以随时调试的逻辑错误。 – David

+0

'DataTable newTable = new DT();'与'private DataTable newTable;'不是相同的DataTable。你在'set'中隐藏了具有该变量的类级DataTable。 –

回答

0

如果你想包装一个数据表,并且只允许消费代码向它添加行,那么根本不要公开数据表。保持私密。事情是这样的:

public class MyTableWrapper 
{ 
    private DataTable table { get; set; } 

    public MyTableWrapper() 
    { 
     table = new DataTable(); 
     table.Columns.Add("Name", typeof(string)); 
     table.Columns.Add("Id", typeof(int)); 
    } 
} 

然后允许用户添加行,只是暴露了一个方法:

public void AddRow(DataRow newRow) 
{ 
    table.Rows.Add(newRow); 
} 

你也可以把一些错误在上面的方法来验证检查所提供的DataRow与该表的模式匹配。如果没有,就抛出异常。

事实上,这也将是一个好主意,暴露了一种方法产生的消费代码行:

public DataRow GetNewRow() 
{ 
    return table.NewRow(); 
} 

对于您可能希望从内置DataTable类暴露任何其他功能,只需根据需要添加更多类似的传递方法即可。包装本身非常简单,只需要一个包装类型的私有成员和传递方法来公开所需的功能。