2014-06-13 46 views
0

我目前正在使用Linq-to-SQL類的一個非常基本的應用程序。我一直在利用它們是「部分」的事實,爲自動生成的數據類添加新的方法和屬性。但是,現在我想實際修改一個類方法中包含的代碼 - 即SendPropertyChanged()。替換C#中的自動生成的代碼

我能看到的最簡單的方法是修改自動生成的.designer.cs文件本身的代碼,但是我可以看到這是非常危險的(因爲代碼可能被代碼生成器覆蓋)。有沒有替代方法可以讓我安全地修改代碼?

編輯:爲什麼我希望這樣做:我想添加一個屬性「isDirty」,只要任何一個字段被更改就設置。因爲每當一個字段被改變時,它會調用SendPropertyChanged方法,我想我會在那裏粘貼「isDirty = true」(通過適當的檢查)。

+1

這聽起來像個壞主意,每次更新你的dbml時,你都會失去你的改變。你爲什麼要替換它?你不能使用其中一種部分方法嗎? – Liath

+1

我想添加一個isDirty屬性到類中,每當更新任何字段時都會設置該屬性。我[我]可以[/ i]使用onFieldChanged()事件(並且無法找到合適的替代方法,我可能會這樣做)並將它們添加到分部類中,但它看起來太不雅觀。 –

+0

使用LINQ to SQL也是一個壞主意。如果您有選擇,我建議切換到更成熟,支持的ORM,如實體框架或nHibernate。 L2S不再被開發......它已經死了。 –

回答

0

不建議更改自動生成的文件,因爲顯而易見的原因是每次更改某些內容並由IDE生成時都會替換它們。

如果您確實想要修改它們,並且因爲它們是partial類,您可以將它們重新定義爲partials或更好,如果可以將它們繼承。

還有另外一個選擇,你可以探索,用Extension Methods,這是添加功能的類,而無需修改他們一個非常簡單的方法

+0

「SendPropertyChanging」等的意義在於生成的屬性會自動調用這些屬性;添加一個擴展方法不會導致這種情況發生 –

+0

@MarcGravell是啊剛剛看到了評論,不知道他正在做那個.. –

0

這裏的想法是,你的代碼添加到On*ChangingOn*Changed方法,例如:

partial void OnNameChanged() { 
    // my code here 
} 

可以還訂閱PropertyChanging/PropertyChanged,但通常是不好的做法(訂閱自己的事件),並且將有性能方面的開銷。

+0

的確,On * Changed方法將是我最後的手段。我只是認爲它有點不雅,在每個方法調用時(對於每個數據庫字段)添加一行代碼,此時已經有另一個已經調用的方法(SendPropertyChanged)。 –