2009-10-16 15 views
28

C'è un modo per chiamare un costruttore di classe parziale con un altro metodo che è possibile definire o meno?Costruttori di classi parziali

Fondamentalmente il mio costruttore di classe parziale è definita:

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

Mi piacerebbe essere in grado di inserire in qualche modo codice aggiuntivo da eseguire dopo che il costruttore di classe è chiamato.

Inoltre, c'è un modo per avere più di un file per iniettare codice extra dopo che il costruttore è stato chiamato?

risposta

49

C# supporta la funzionalità di partial methods. Ciò consente a una definizione di classe parziale di inoltrare un metodo che l'altra parte della classe parziale può quindi definire opzionalmente.

metodi parziali hanno alcune limitazioni:

  • essi devono essere di tipo void (senza ritorno)
  • non possono accettare i punti principali, essi possono tuttavia accettare parametri ref
  • non possono essere virtuale o extern e NON PUO 'sovrascrivere o sovrascrivere un altro metodo (tramite la parola chiave "nuova")

I metodi parziali sono implicitamente chiusi e privati.

Tuttavia, non è possibile che due parti diverse di una classe parziale implementino lo stesso metodo parziale.I metodi generalmente parziali vengono utilizzati nelle classi parziali generate dal codice come metodo per consentire la parte non estesa dell'estensione o personalizzare il comportamento della parte generata (o talvolta viceversa). Se un metodo parziale viene dichiarato ma non implementato in alcuna parte di classe, il compilatore eliminerà automaticamente tutte le chiamate ad esso.

Ecco un esempio di codice:

public partial class PartialTestClass 
{ 
    partial void DoSomething(); 

    public PartialTestClass() { DoSomething(); } 
} 

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

In realtà possono accettare parametri di riferimento. Non accettano. –

+1

Sì grazie Mircea, l'ho appena aggiustato. – LBushkin

+4

Purtroppo non è possibile assegnare valori ai campi 'readonly' da questi metodi parziali, quindi tecnicamente non ci sono costruttori parziali anche se si decide di chiamarli dal costruttore. –

5

Cerca "metodi parziali". Faranno esattamente quello che vuoi.

Ad esempio:

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

Ebbene, in C# 3.0 si può avere ciò che sono chiamati metodi parziali - metodo che può essere chiamato, anche se non sono veramente lì.

Se non sono definiti in nessuno dei file di classe parziale, la chiamata ad essi verrà rimossa dal compilatore/linker .NET.

Quindi è possibile definire ad es. una classe di clienti:

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

Tali metodi parziali OnBeforeUpdateName(), ecc si chiamerà, ma se il tuo nessuno dei file di classe parziali in realtà non implementa nulla per loro, che la chiamata sarà senza alcun effetto. Linq-to-SQL utilizza questo grande momento per questo tipo di metodi di notifica.

vedere quelle post del blog sui metodi parziali:

Marc

+1

"classe discendente": la ragione di usare un metodo parziale è di averlo implementato nella stessa * * classe, ma un file parziale diverso. Se non è implementato nella stessa classe, viene rimosso dal compilatore. – itowlson

+0

E 'possibile per più classi parziali dichiarare questo metodo, o può essere dichiarato max una volta sola? – Omar

+0

@itowlson: ovviamente, mi dispiace, ho ottenuto metodi parziali e l'ereditarietà mescolati :-) –

Problemi correlati