1

部分クラスの既存のメソッドをオーバーライドする方法はありますか?

このようなもの(私はこれがコンパイルされないことを知っています)

/// <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%には、プロパティに固有のメソッドがあります。

しかし、私は1回限りの方法が必要な場合に遭遇しています。

私が見落としているこのようなものはありますか?またはいくつかの提案された代替案?

4

3 に答える 3

1

これには部分メソッドを使用できます。署名などを変更する必要がある場合は、ここで推定できると思います。

また、部分メソッドを定義し、クラスの別の部分ビットで誰もその実装を定義していない場合、エラーではなくノーオペレーションになるため、問題が発生することを心配する必要がないことにも注意してください。 . 文字通り、まさにこのユースケースのために構築されました。

/// <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
    }
}
于 2012-04-05T14:43:28.673 に答える
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.
}

次に、必要な手動コードのスタブ実装を提供する大きなコメントを付けて、コンパイルしないメソッドを生成することにより、生成されたメソッドに手動コードの必要性をフラグ付けすることがあります。それはかなり成功しています。

于 2012-04-05T19:16:02.763 に答える
0

生成されたクラスから派生させ、派生クラスでメソッドをオーバーライドしてみませんか?

于 2012-04-05T14:50:08.807 に答える