Честно говоря, звучит так, будто вы действительно хотите, чтобы эти Column
были классами, но не хотите оплачивать затраты времени выполнения, связанные с классами, поэтому вы пытаетесь сделать их структурами. Я не думаю, что вы найдете элегантный способ делать то, что вы хотите. Структуры должны быть типами значений, и вы хотите, чтобы они вели себя как ссылочные типы.
Вы не можете эффективно хранить ваши столбцы в массиве IColumn
с, поэтому подход с использованием массива не будет работать хорошо. Компилятор не может знать, что массив IColumn
будет содержать только структуры, и, действительно, это не поможет, потому что существуют различные типы структур, которые вы пытаетесь вставить в него. Каждый раз, когда кто-то звонит AcceptChanges()
или HasChanges()
, вы все равно будете заканчивать боксом и клонированием своих структур, поэтому я серьезно сомневаюсь, что превращение вашей Column
в структуру вместо класса сэкономит вам много памяти.
Однако вы могли бы , вероятно, хранить ваши Column
непосредственно в массиве и индексировать их с помощью перечисления. Например:
public class Record
{
public enum ColumnNames { ID = 0, Name, Date, Int, NumCols };
private IColumn [] columns;
public Record()
{
columns = new IColumn[ColumnNames.NumCols];
columns[ID] = ...
}
public bool HasChanges
{
get
{
bool has = false;
for (int i = 0; i < columns.Length; i++)
has |= columns[i].HasChanges;
return has;
}
}
public void AcceptChanges()
{
for (int i = 0; i < columns.Length; i++)
columns[i].AcceptChanges();
}
}
У меня нет под рукой компилятора C #, поэтому я не могу проверить, сработает ли это, или нет, но основная идея должна работать, даже если я не понял все детали правильно. Тем не менее, я просто пошел бы и сделал их уроки. Вы все равно платите за это.