我正在试验泛型,我试图创建类似于数据集类的结构。
我有以下代码类与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