2009-10-16 10 views
28

¿Hay alguna forma de que un constructor de clase parcial llame a otro método que no esté definido o no?Constructores de clase parciales

Básicamente mi constructor de la clase parcial se define:

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

Me gustaría ser capaz de insertar código adicional alguna manera para ser ejecutado después de que el constructor de la clase se llama.

Además, ¿hay alguna manera de tener más de un archivo para inyectar código adicional después de llamar al constructor?

Respuesta

49

C# es compatible con la función partial methods. Éstos permiten que una definición de clase parcial reenvíe declare un método que otra parte de la clase parcial puede definir opcionalmente.

métodos parciales tienen algunas restricciones:

  • deben ser del tipo void (sin retorno)
  • que no pueden aceptar a cabo parámetros, sin embargo, puede aceptar parámetros ref
  • que no puede ser virtual o extern y NO PUEDE anular o sobrescribir otro método (mediante la palabra clave "nueva")

Los métodos parciales están implícitamente sellados y son privados.

Sin embargo, no es posible tener dos partes diferentes de una clase parcial implementando el mismo método parcial.En general, los métodos parciales se utilizan en clases parciales generadas por código como una forma de permitir que la parte no generada de extender o personalizar el comportamiento de la parte que se genera (o, a veces, viceversa). Si se declara un método parcial pero no se implementa en ninguna parte de la clase, el compilador eliminará automáticamente cualquier llamada.

Aquí está un ejemplo de código:

public partial class PartialTestClass 
{ 
    partial void DoSomething(); 

    public PartialTestClass() { DoSomething(); } 
} 

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

En realidad, pueden aceptar parámetros de ref. Ellos no aceptan. –

+1

Sí, gracias Mircea, simplemente lo solucioné. – LBushkin

+4

Desafortunadamente, no puede asignar valores a los campos 'readonly' desde estos métodos parciales, por lo que técnicamente no hay constructores parciales, incluso si decide llamarlos solo desde el constructor. –

5

Buscar "métodos parciales". Harán exactamente lo que quieras.

Por ejemplo:

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

Bueno, en C# 3.0 que puede tener lo que se llama métodos parciales - método que se puede llamar, incluso si no están realmente allí.

Si no están definidos en ninguno de los archivos de clase parciales, el compilador/enlazador de .NET los eliminará.

Así que podría definir, p. una clase de clientes:

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

Esos métodos parciales OnBeforeUpdateName(), etc se llama, pero si su ninguno de los archivos de clases parciales en realidad no implementar cualquier cosa por ellos, que será llamada sin ningún efecto. Linq-to-SQL usa este gran momento para este tipo de métodos de notificación.

Ver las entradas del blog sobre los métodos parciales:

Marc

+1

"clase descendiente": la razón para utilizar un método parcial es que sea implementado en el mismo * * clase, pero un parcial de archivos diferente. Si no se implementa en la misma clase, el compilador lo elimina. – itowlson

+0

¿Es posible que varias clases parciales declaren este método, o solo se puede declarar como máximo una vez? – Omar

+0

@itowlson: por supuesto, lo siento, se mezclaron los métodos parciales y la herencia :-) –