代码生成问题,覆盖现有方法实现

本文关键字:有方法 实现 覆盖 成问题 代码 | 更新日期: 2023-09-27 18:30:03

是否有方法覆盖分部类中的现有方法?

像这样的东西(我知道这不会编译)

/// <summary>
/// Generated Code for MyClass
/// </summary>
public partial class MyClass
{
    public void MyMethod()
    {
        //Do work specific to MyClass
    }
}
/// <summary>
/// Non-generated extension for MyClass
/// </summary>
public partial class MyClass
{
    public override void MyMethod()
    {
        //Do some other work
    }
}

我在做一些代码生成时遇到了这种需求。我正在从我的EDMX和这些类的方法生成分部类,其中90%的类将具有特定于其属性的方法。

但我遇到了一些情况,我希望一次性的方法。

有这样的东西我在俯瞰吗?或者一些建议的替代方案?

代码生成问题,覆盖现有方法实现

您可以为此使用分部方法。如果你需要对签名等进行更改,我想你可以在这里进行推断。

同样值得注意的是,如果你定义了一个分部方法,而没有人在类的另一个分部中为它定义实现,那么它只会变成一个no-op,而不是一个错误,所以你不需要担心这会导致问题。它实际上就是为这个用例而构建的。

/// <summary>
/// Generated Code for MyClass
/// </summary>
public partial class MyClass
{
    private partial void MyMethodImpl();
    public void MyMethod()
    {
        //Do work specific to MyClass
        MyMethodImpl();
    }
}
/// <summary>
/// Non-generated extension for MyClass
/// </summary>
public partial class MyClass
{
    public void MyMethodImpl()
    {
        //Do some other work
    }
}

我们在代码库中广泛使用带有标记扩展点的双派生模式。http://msdn.microsoft.com/en-us/library/bb126289(v=vs.100).aspx

生成的代码如下所示:

public abstract class FooBase
{
   protected FooBase()
   {
   }
   public virtual int GetSomeThing()
   {
      // ... some generated implementation ...
   }
}
public partial class Foo
{
   public Foo() : FooBase()
   {
   }
   // Nothing except the constructor generated in this class.
}

然后,我们偶尔会让生成的方法通过生成不编译的方法来标记它们对手动代码的需求,并用一个大注释为所需的手动代码提供存根实现。它非常成功。

为什么不从生成的类派生并重写派生类中的方法?