2010-10-17 52 views
0

我玩弄SQLite和屬性,和我有一個看起來像這樣在我的代碼性能:如何使用屬性來減少我的屬性中的樣板?

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

恕我直言更新屬性更新後的數據庫是不是一個好主意......看看現有的ORM框架,他們都沒有像這樣工作,所以可能有很好的理由(關閉頂部我的頭,我能想到2:效率和數據完整性/一致性) – 2010-10-17 15:12:14

+0

@Thomas:謝謝,我會環顧四周。我之前沒有做過任何ORM - 也許已經有一個框架可以滿足我的需求。 – 2010-10-17 15:28:17

+0

是的,當然有;)。編寫一個ORM是困難的,所以除非你有非常特殊的需求,否則我會推薦使用現有的(實體框架相當不錯,NHibernate也被廣泛使用,但是更困難的IMO) – 2010-10-17 15:34:03

回答

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

再重的問題;引入比較慢的反射。如果可能的話,我會避免它。

+0

謝謝,這個作品很棒。我必須養成使用這些通用方法的習慣。 – 2010-10-17 15:26:28

相關問題