2009-02-24 57 views
4

我正在使用強類型DataSet手動添加行會出錯。我正在提供工廠方法以正確創建行。我想引導我的班級的消費者遠離*Table生成的Add*Row方法。如何將生成的方法標記爲過時?

Obsolete attributes添加到生成的方法會做的伎倆。可悲的是,他們將在下次生成代碼時被刪除。

我不能在非生成的代碼中使用partial methods,因爲VS2008 DataSet設計器不使用它們。

MyType.Dataset.Designer.cs看起來有點像這樣:

public partial class ThingyDataTable : global::System.Data.DataTable, global::System.Collections.IEnumerable { 
    // I'd love an [Obsolete("Please use the factory method.")] here. 
    // I can't use a partial method, as this method isn't partial. 
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 
    public ShelfRow NewShelfRow() 
     return ((ShelfRow)(this.NewRow())); 
    } 
} 

有一些方法可以讓我從MyType.cs添加Obsolete屬性?由於成員已經定義,嘗試C樣式原型不起作用。由於生成的成員不是partial,因此partial中的干擾不起作用。

// BROKEN EXAMPLE: 
public partial class ThingyDataTable { 
    // I'd love an [Obsolete("Please use the factory method.")] here. 
    // I can't use a partial method, as this method isn't partial. 
    [Obsolete("Please use the factory method.")] 
    public ShelfRow NewShelfRow(); // ERROR: member already defined. 
} 

有一些其他的方式,我可以標記生成的方法Obsolete

我該怎樣才能警告消費者遠離生成的方法?

+0

我會嘗試這個查找並替換爲「[global :: System.Diagnostics.DebuggerNonUserCodeAttribute()] [Obsolete(」請使用工廠方法。「)」[global :: System.Diagnostics.DebuggerNonUserCodeAttribute()]「 ]」。我無法找到DataSets的模板 – jrcs3 2009-02-25 00:03:11

+0

編輯模板是一個非常有趣的想法。我如何確保任何擁有VS2008股票的人都會在查看源代碼後最終使用該模板? – 2009-02-25 00:08:51

+0

如果你能找到模板。我認爲Visual Studio使用xsd.exe爲DataSet生成類,模板數據位於.exe或某些支持的.dll。 – jrcs3 2009-02-25 00:49:58

回答

1

用於從XSD文件生成設計器文件的自定義工具的開箱即用性不是很好。

但是你可以:

  • 從您的類型化的DataSet XSD文件的「屬性」對話框中刪除它,那就是該領域的「自定義工具」,從「MSDataSetGenerator」設置爲空。這樣,您就可以控制代碼的生成時間。但是這很容易出錯,因爲你將來可能會忘記這麼做......
  • 你可以創建自己的自定義工具來調用xsd.exe工具,並將你想要的屬性放在合適的位置,但是這意味着您在所有的開發工作站上安裝自定義工具並構建服務器。 (請參閱this post指針)
  • 或者,最後,您可以強制代碼生成器創建DataSet的內部實現,並使這些類實現一組公共接口,您可以允許客戶端使用它們。您的數據集類將不能直接在組件外部使用,但您的接口將可用。

後者的「automagic」少一些,因爲您需要反映界面中DataSet模式的更改,但是您控制了所有內容並且更加「適合工廠」。

0

它生成的代碼,正確。沒有什麼能阻止你使用發生器的輸出作爲輸入到另一個發生器,爲你添加[Obsolete]屬性。

1

另一種選擇是使用PostSharp 1.5和新的CustomAttributeInjector方面(請參閱online documentation)。

基本上,做一個CompoundAspect,並添加一個CustomAttributeInjectorAspect到任何你想要的。這應該工作。

-gael

1

使用new關鍵字在您的非產生的部分類:

public partial interface ICaseRepository 
    : IRepository<Case> 
{ 
    void Delete(int id); 

    [Obsolete("Use Delete(int id) instead.")] 
    new void Delete(Case entity); 
} 

這將允許生成的方法的所有當前慣例產生編譯時的警告。

相關問題