【问题标题】:Replacing Auto-Generated Code in C#在 C# 中替换自动生成的代码
【发布时间】:2014-08-04 01:11:47
【问题描述】:

我目前正在开发一个使用 Linq-to-SQL 类的非常基本的应用程序。通过利用它们是“部分的”这一事实,我一直在向自动生成的数据类添加新的方法和属性。但是,现在我想实际修改一个类方法中包含的代码 - 即 SendPropertyChanged()。

我能看到的最简单的方法是修改自动生成的 .designer.cs 文件本身中的代码,但我可以看到这是非常危险的(因为代码可能会被代码生成器覆盖) .有没有其他方法可以让我安全地修改代码?

编辑:我为什么要这样做:我想添加一个属性“isDirty”,只要任何字段发生更改,就会设置该属性。因为每当更改字段时,它都会调用 SendPropertyChanged 方法,我想我会在其中粘贴“isDirty = true”(进行适当的检查)。

【问题讨论】:

  • 这听起来是个坏主意,每次更新 dbml 都会丢失所做的更改。为什么要更换它?不能使用其中一种分部方法吗?
  • 我想在类中添加一个 isDirty 属性,每当更新任何字段时都会设置该属性。我[i]可以[/i]使用 onFieldChanged() 事件(如果找不到合适的替代方法,我可能会)并将它们添加到部分类中,但这似乎太不雅了。
  • 使用 LINQ to SQL 也是个坏主意。如果您可以选择,我建议您切换到更成熟、受支持的 ORM,例如 Entity Framework 或 nHibernate。 L2S 不再被开发......它已经死了。
  • @DanielMann 我不打算走那么远,但为 NH +1

标签: c# .net wpf


【解决方案1】:

不建议更改自动生成的文件,因为很明显的原因是每次更改某些内容时它们都会被替换,并且 IDE 会生成它。

如果你真的想修改它们,并且因为它们是 partial 类,你可以将它们重新定义为部分或更好,如果你可以将它们子类化的话。

您可以探索另一个选项,即使用Extension Methods,这是一种无需修改即可向类添加功能的非常简单的方法

【讨论】:

  • SendPropertyChanging等的意义在于生成的属性会自动调用这些;添加扩展方法不会导致这种情况发生
【解决方案2】:

这里的想法是将代码添加到On*ChangingOn*Changed 方法中,例如:

partial void OnNameChanged() {
    // my code here
}

也可以订阅PropertyChanging/PropertyChanged,但这通常是不好的做法(订阅您自己的事件),并且会产生性能开销。

【讨论】:

  • 确实,On*Changed 方法将是我最后的手段。当已经有另一个方法(SendPropertyChanged)也已经被调用时,我只是认为向每个方法调用(对于每个数据库字段)添加一行代码有点不雅。
猜你喜欢
  • 2011-07-14
  • 2019-10-19
  • 1970-01-01
  • 2016-09-10
  • 2014-07-17
  • 2016-09-23
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多