我正在使用Sqlite和Attributes,我的代码中的属性看起来像这样:
const string FooKey = "foo";
...
string m_foo;
[DatabaseColumn (FooKey)]
public string Foo {
get { return m_foo; }
set {
if (m_foo == value)
return;
m_foo = value;
OnFooChanged (); // Calls the event FooChanged after a null check
Update (FooKey, Foo); // Updates the field in the database
}
}
对于与表中的列对应的每个属性,这是相同的,唯一的更改是名称和类型。也就是说,可能还有另外一个属性:
const string BarKey = "bar";
...
bool m_bar;
[DatabaseColumn (BarKey)]
public bool Bar {
get { return m_bar; }
set {
if (m_bar == value)
return;
m_bar = value;
OnBarChanged (); // Calls the event BarChanged after a null check
Update (BarKey, Bar); // Updates the field in the database
}
}
现在我只使用DatabaseColumn属性来识别哪些字段对应于表中的列,这样我就可以更轻松地将整行插入数据库。有没有办法让DatabaseColumn更多地负责,以减少代码中的样板?
答案 0 :(得分:2)
如何开始:
private void SetField<T>(
ref T field, T value,
string key, EventHandler handler)
{
if(EqualityComparer<T>.Default
.Equals(field, value)) return;
field = value;
if(handler!=null) handler(this, EventArgs.Empty);
if(key!=null) Update(key,value);
}
public int Foo {
get { return foo; }
set { SetField(ref foo, value, FooKey, FooChanged); }
}
重新提出使用属性的问题;这引入了相对缓慢的反射。如果可能的话我会避免它。