我正在使用强类型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
吗?
我如何警告消费者远离生成的方法?
答案 0 :(得分:1)
用于从XSD文件生成设计器文件的自定义工具开箱即用的配置不是很多。
但你可以:
后者不那么“自动化”,因为您需要反映接口中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]属性的另一个生成器的输入。