Как я могу уменьшить шаблон в моих свойствах, используя атрибуты? - PullRequest
0 голосов
/ 17 октября 2010

Я играю с 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 Ответ

2 голосов
/ 17 октября 2010

Как насчет чего-то, начинающегося:

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

Повторный вопрос об использовании атрибутов; это вводит отражение, которое является относительно медленным. Я хотел бы избежать этого, если это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...