web-dev-qa-db-ja.com

部分クラスコンストラクター

部分クラスのコンストラクターに、自分のまたは定義されていない可能性のある別のメソッドを呼び出させる方法はありますか?

基本的に、私の部分的なクラスコンストラクターが定義されています。

public partial class Test
{
     public Test()
     {
          //do stuff
     }
}

クラスコンストラクターが呼び出された後に実行される追加のコードをなんとかして挿入できるようにしたいと思います。

さらに、コンストラクターが呼び出された後に追加のコードを挿入するために複数のファイルを使用する方法はありますか?

36
Omar

C#は 部分メソッド の機能をサポートしています。これらにより、部分クラス定義は、部分クラスの別の部分がオプションで定義できるメソッドを転送宣言できるようになります。

部分メソッドにはいくつかの制限があります:

  • それらはvoidタイプでなければなりません(戻りなし)
  • パラメータを受け入れることはできませんが、参照パラメータを受け入れることはできます
  • それらは仮想または外部であってはならず、(「新しい」キーワードを介して)別のメソッドをオーバーライドまたは上書きすることはできません。

部分メソッドは暗黙的に封印され、プライベートです。

ただし、部分クラスの2つの異なる部分に同じ部分メソッドを実装させることはできません。一般に、部分メソッドは、生成された部分の動作の拡張またはカスタマイズの非生成部分を許可する方法として、コード生成された部分クラスで使用されます(またはその逆の場合もあります)。部分メソッドが宣言されているが、クラス部分に実装されていない場合、コンパイラーはそのメソッドへの呼び出しを自動的に削除します。

ここにコードサンプルがあります:

 public partial class PartialTestClass
 {
     partial void DoSomething();

     public PartialTestClass() { DoSomething(); }
 }

 public partial class PartialTestClass
 {
     partial void DoSomething()  { /* code here */ }
 }
56
LBushkin

「部分メソッド」を検索します。彼らはあなたが望むことを正確に行います。

例えば:

public partial class Test
{
    public Test()
    {
         //do stuff

         DoExtraStuff();
    }

    partial void DoExtraStuff();
}


public partial class Test // in some other file
{
     partial void DoExtraStuff()
     {
         // do more stuff
     }
}
8
Neil

まあ、C#3.0では、部分メソッドと呼ばれるものを持つことができます-実際にはそこにない場合でも呼び出すことができるメソッド。

それらが部分クラスファイルで定義されていない場合、それらの呼び出しは.NETコンパイラ/リンカーによって削除されます。

たとえば、次のように定義できます。 Customerクラス:

partial class Customer
{
  string name;

  public string Name
  {
    get
    {
      return name;
    }
    set
    {
      OnBeforeUpdateName();
      OnUpdateName();
      name = value;
      OnAfterUpdateName();
    }
  }

  partial void OnBeforeUpdateName();
  partial void OnAfterUpdateName();
  partial void OnUpdateName();
}

これらの部分メソッドOnBeforeUpdateName()などが呼び出されますが、部分クラスファイルのいずれにも実際に何も実装されていない場合、その呼び出しは効果がありません。 Linq-to-SQLは、この種の通知メソッドにこの大きな時間を使用します。

部分的なメソッドに関するこれらのブログ投稿を参照してください。

マーク

8
marc_s