2009-02-24 80 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); 
} 

这将允许生成的方法的所有当前惯例产生编译时的警告。

相关问题