2017-02-20 7 views
0

Я хочу создать класс таблицы данных с указанными столбцами, которые я могу использовать для вызова методов, например копирования или агрегации, где я могу перебирать некоторые записи и добавлять их в таблицу.Создать повторно используемый объект данных; Только Add On Iterations

Я думал, что я мог бы создать частные и государственные наборы переменных и присвоить значение таблицы моим по умолчанию, как:

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)); 
    } 
} 

Моя мысль была о том, что человек может получить эту таблицу, но не мог» t установите его, потому что он установлен на значение по умолчанию. Тем не менее, я вижу сообщение от интерфейса, что это всегда будет null, даже если я позже использую его в методе.

Другой удар я взял создавал статический класс, который я мог бы использовать в способе, вовлекая выше с таблицей данных создаются:

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

Эта функция не работает так, как мне нужно на каждой итерации когда кто-то итерирует более 100 тыс. записей, я не хочу, чтобы каждый раз создавалась таблица данных; Я хочу, чтобы таблица данных создавалась один раз с определением, строка данных, созданная один раз, затем на каждой итерации данные добавляются в новую строку на основе имен столбцов из определения. Я думал, что класс будет иметь определение таблицы данных, которое никогда не изменится, и строку данных, которая может быть изменена на каждой итерации и добавлена ​​в таблицу.

Основываясь на том, что я пытаюсь сделать, где я ошибаюсь, или это даже возможно?

+1

Исходная проблема заключается в том, что сеттер не устанавливает закрытую переменную, он просто создает новую переменную и затем отбрасывает ее. Таким образом, 'newTable' класса класса всегда« null ». Но более значительная проблема с дизайном заключается в том, что сеттер фактически не устанавливает то, что ему дано, что будет очень вводить в заблуждение и вызовет всевозможные логические ошибки, которые сложно отлаживать с течением времени. – David

+0

'DataTable newTable = new DT();' не тот же DataTable, что и 'private DataTable newTable;'. Вы скрываете DataTable на уровне класса с этой переменной в 'set'. –

ответ

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 класса, просто добавьте другие подобные методы прохождения по мере необходимости. Сама оболочка очень проста, все, что ей нужно, является частным членом типа, который является обернутым и сквозным, чтобы выставить только те функции, которые вы хотите.

 Смежные вопросы

  • Нет связанных вопросов^_^