如何标记生成的方法已过时?

时间:2009-02-24 23:23:24

标签: .net ado.net attributes warnings

我正在使用强类型DataSet ,因此手动添加行会容易出错。我正在提供工厂方法来正确创建行。我想引导我的班级消费者远离Add*Row类上生成的*Table方法。

将<{3}}添加到生成的方法就行了。遗憾的是,它们将在下次生成代码时被删除。

我无法在非生成代码中使用 Obsolete attributes ,因为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()));
    }
 }

我是否可以通过Obsolete添加MyType.cs属性?尝试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吗?

我如何警告消费者远离生成的方法?

4 个答案:

答案 0 :(得分:1)

用于从XSD文件生成设计器文件的自定义工具开箱即用的配置不是很多。

但你可以:

  • 从类型化数据集的xsd文件的“属性”对话框中删除它,即将“自定义工具”字段从“MSDataSetGenerator”设置为空。这样,您可以控制生成代码的时间。但这很容易出错,因为将来你可能会忘记这样做......
  • 您可以创建自己的自定义工具来调用xsd.exe工具,并将所需的属性放在适当的位置,但这意味着您需要在所有开发站和构建服务器上安装自定义工具。 (参见this post指示)
  • 或者,最后,您可以强制代码生成器创建DataSet的内部实现,并使类实现一组允许客户端使用的公共接口。您的数据集类不能直接在程序集外部的任何位置使用,但您的接口将是。

后者不那么“自动化”,因为您需要反映接口中DataSet架构的变化,但是您可以控制所有内容并且更加“工厂友好”。

答案 1 :(得分:1)

另一种选择是使用PostSharp 1.5和新的CustomAttributeInjector方面(见online documentation)。

基本上,创建一个CompoundAspect,并将CustomAttributeInjectorAspect添加到您想要的任何内容中。这应该有用。

-gael

答案 2 :(得分:1)

在非生成的分部类中使用new关键字:

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

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

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

答案 3 :(得分:0)

这是生成的代码,对吧。没有什么能阻止你使用生成器的输出作为输入到为你添加[Obsolete]属性的另一个生成器的输入。