web-dev-qa-db-fra.com

Constructeurs de classe partielle

Existe-t-il un moyen pour qu'un constructeur de classe partielle appelle une autre méthode qui peut ou non être définie?

Fondamentalement, mon constructeur de classe partielle est défini:

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

Je voudrais pouvoir en quelque sorte insérer du code supplémentaire à exécuter après l'appel du constructeur de classe.

De plus, existe-t-il un moyen d'avoir plus d'un fichier pour injecter du code supplémentaire après l'appel du constructeur?

36
Omar

C # prend en charge la fonctionnalité de méthodes partielles . Ceux-ci permettent à une définition de classe partielle de déclarer en avant une méthode qu'une autre partie de la classe partielle peut ensuite éventuellement définir.

Les méthodes partielles ont certaines restrictions:

  • ils DOIVENT être de type nul (pas de retour)
  • ils NE PEUVENT PAS accepter les paramètres, ils peuvent cependant accepter les paramètres ref
  • ils NE PEUVENT PAS être virtuels ou externes et NE PEUVENT PAS remplacer ou écraser une autre méthode (via le mot-clé "new")

Les méthodes partielles sont implicitement scellées et privées.

Il n'est cependant pas possible que deux parties différentes d'une classe partielle implémentent la même méthode partielle. Généralement, les méthodes partielles sont utilisées dans les classes partielles générées par le code pour permettre à la partie non générée d'étendre ou de personnaliser le comportement de la partie générée (ou parfois vice versa). Si une méthode partielle est déclarée mais n'est implémentée dans aucune partie de classe, le compilateur éliminera automatiquement tous les appels à celle-ci.

Voici un exemple de code:

 public partial class PartialTestClass
 {
     partial void DoSomething();

     public PartialTestClass() { DoSomething(); }
 }

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

Recherchez "méthodes partielles". Ils feront exactement ce que vous voulez.

Par exemple:

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

Eh bien, en C # 3.0, vous pouvez avoir ce qu'on appelle des méthodes partielles - méthode qui peut être appelée, même si elles ne sont pas vraiment là.

S'ils ne sont définis dans aucun des fichiers de classe partiels, l'appel à ceux-ci sera supprimé par le compilateur/éditeur de liens .NET.

Vous pouvez donc définir par exemple une classe Client:

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();
}

Ces méthodes partielles OnBeforeUpdateName () etc. seront appelées mais si aucun des fichiers de classe partiels n'implémente réellement quelque chose pour eux, cet appel sera sans effet. Linq-to-SQL utilise ce grand temps pour ce type de méthodes de notification.

Voir ces articles de blog sur les méthodes partielles:

Marc

8
marc_s