如何使用属性减少属性中的样板?

时间:2010-10-17 14:40:13

标签: c# .net mono attributes

我正在使用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更多地负责,以减少代码中的样板?

1 个答案:

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

重新提出使用属性的问题;这引入了相对缓慢的反射。如果可能的话我会避免它。