我正在試驗泛型,我試圖創建類似於數據集類的結構。
我有以下代碼類與valueTypes字段和拳擊
public struct Column<T>
{
T value;
T originalValue;
public bool HasChanges
{
get { return !value.Equals(originalValue); }
}
public void AcceptChanges()
{
originalValue = value;
}
}
public class Record
{
Column<int> id;
Column<string> name;
Column<DateTime?> someDate;
Column<int?> someInt;
public bool HasChanges
{
get
{
return id.HasChanges | name.HasChanges | someDate.HasChanges | someInt.HasChanges;
}
}
public void AcceptChanges()
{
id.AcceptChanges();
name.AcceptChanges();
someDate.AcceptChanges();
someInt.AcceptChanges();
}
}
問題我已經是,當我添加新的專欄中,我還需要添加它在HasChanges屬性和的AcceptChanges()方法。這只是要求重構。
是卡梅斯我的腦海所以第一個解決方案是這樣的:
public interface IColumn
{
bool HasChanges { get; }
void AcceptChanges();
}
public struct Column<T> : IColumn {...}
public class Record
{
Column<int> id;
Column<string> name;
Column<DateTime?> someDate;
Column<int?> someInt;
IColumn[] Columns { get { return new IColumn[] {id, name, someDate, someInt}; }}
public bool HasChanges
{
get
{
bool has = false;
IColumn[] columns = Columns; //clone and boxing
for (int i = 0; i < columns.Length; i++)
has |= columns[i].HasChanges;
return has;
}
}
public void AcceptChanges()
{
IColumn[] columns = Columns; //clone and boxing
for (int i = 0; i < columns.Length; i++)
columns[i].AcceptChanges(); //Here we are changing clone
}
}
你可以從註釋中看到我們這裏有幾個問題與結構克隆。對此的簡單解決方案是將Column更改爲類,但是從我的測試看來,它增加了40%的內存使用量(因爲每個對象元數據),這是我無法接受的。
所以我的問題是:有沒有人有任何其他的想法如何創建方法,可以在不同的結構化對象/記錄工作?也許F#社區的某個人可以提出功能語言如何解決這些問題,以及它如何影響性能和內存使用。
編輯:
SFG謝謝你關於宏的建議。
在Visual Studio 2008中,有內置(但不是衆所周知的)稱爲T4的模板引擎。總的來說,我要將'.tt'文件添加到我的項目中,並創建一個模板來搜索我所有的類,以某種方式識別記錄(例如通過它們實現的某個接口),並用HasChanges和AcceptChanges生成部分類)將只調用該類包含的列。
一些有用的鏈接:
T4 Editor for VS
Blog with links and tutorials about T4
Blog entry with example that uses EnvDTE to read project files