2009-10-16 10 views
28

Existe-t-il un moyen pour un constructeur de classe partielle d'appeler une autre méthode que ma ou peut ne pas être définie?Constructeurs de classes partielles

Fondamentalement, mon constructeur de la classe partielle est définie:

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

Je voudrais être en mesure d'insérer du code supplémentaire en quelque sorte à courir après le constructeur de la classe est appelée.

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?

Répondre

49

C# prend en charge la fonctionnalité partial methods. Ceux-ci permettent à une définition de classe partielle de transmettre une méthode qu'une autre partie de la classe partielle peut éventuellement définir.

méthodes partielles ont des restrictions:

  • ils doivent être de type vide (pas de retour)
  • ils ne peuvent pas accepter des paramètres, ils peuvent cependant accepter des paramètres ref
  • ils ne peuvent pas être virtuel ou extern et NE peut pas surcharger ou remplacer 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 d'avoir deux portions différentes d'une classe partielle implémentant 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 afin de 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 la classe, le compilateur éliminera automatiquement tous les appels.

Voici un exemple de code:

public partial class PartialTestClass 
{ 
    partial void DoSomething(); 

    public PartialTestClass() { DoSomething(); } 
} 

public partial class PartialTestClass 
{ 
    partial void DoSomething() { /* code here */ } 
} 
+4

En fait, ils peuvent accepter les paramètres ref. Ils n'acceptent pas. –

+1

Oui merci Mircea, juste arrangé ça. – LBushkin

+4

Malheureusement, vous ne pouvez pas affecter de valeurs aux champs 'readonly' à l'intérieur de ces méthodes partielles, donc techniquement il n'y a pas de constructeurs partiels même si vous décidez de ne les appeler que depuis le constructeur. –

5

Recherche de "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 
    } 
} 
7

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

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

Ainsi, vous pouvez définir par ex. 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. sera appelée mais si votre aucun des fichiers de classe partielle ne fait rien mettre en œuvre pour eux, cet appel sera sans aucun effet. Linq-to-SQL utilise ce grand temps pour ce genre de méthodes de notification.

Voir les messages de blog sur les méthodes partielles:

Marc

+1

« classe descendante »: la raison d'utiliser une méthode partielle est d'avoir mis en œuvre dans le * même * classe, mais un fichier partiel différent. Si ce n'est pas implémenté dans la même classe, il est supprimé par le compilateur. – itowlson

+0

Est-il possible pour plusieurs classes partielles de déclarer cette méthode, ou peut-elle seulement être déclarée max une fois? – Omar

+0

@itowlson: bien sûr, désolé, obtenu des méthodes partielles et l'héritage mélangé :-) –

Questions connexes