4

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

Obsolete 属性添加到生成的方法中就可以了。遗憾的是,它们将在下次生成代码时被删除。

我不能在非生成代码中使用部分方法,因为 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

4 回答 4

1

用于从 XSD 文件生成设计器文件的自定义工具并没有太多开箱即用的可配置性。

但是您可以:

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

后者不那么“自动化”,因为您需要在界面中反映 DataSet 模式的变化,但您可以控制一切并且更加“工厂友好”。

于 2009-02-25T02:48:56.210 回答
1

另一种选择是使用 PostSharp 1.5 和新的 CustomAttributeInjector 方面(参见在线文档)。

基本上,制作一个 CompoundAspect,然后将一个 CustomAttributeInjectorAspect 添加到您想要的任何东西上。这应该有效。

于 2009-03-05T21:23:09.083 回答
1

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

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

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

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

于 2014-10-09T16:40:12.763 回答
0

它是生成的代码,对。没有什么能阻止您将生成器的输出用作另一个生成器的输入,该生成器会为您添加 [Obsolete] 属性。

于 2009-02-25T03:44:52.673 回答