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

时间:2012-04-05 14:39:20

标签: c# code-generation t4 edmx partial-classes

有没有办法覆盖分部类中的现有方法?

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

/// <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%的类将具有特定于其属性的方法。

但我遇到的情况是我想要一次性的方法。

有什么我喜欢的东西吗?或者一些建议的替代方案?

3 个答案:

答案 0 :(得分:1)

您可以使用部分方法。如果您需要更改签名等,我假设你可以在这里推断。

还值得注意的是,如果你定义一个局部方法而没有人在类的另一个部分位置定义它的实现,它只会变成一个无操作,而不是一个错误,所以你不要&#39 ; t需要担心造成问题。它实际上是为这个用例而构建的。

/// <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
    }
}

答案 1 :(得分:1)

我们在代码库中广泛使用带有标记扩展点的双派生模式。 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.
}

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

答案 2 :(得分:0)

为什么不从派生类中生成的类和覆盖方法派生?