2009-09-07 18 views
22

¿Hay un análogo de C# para los decoradores de funciones de Python? Parece que es factible con los atributos y el marco de reflexión, pero no veo una forma de reemplazar funciones en tiempo de ejecución.decoradores de función en C#

Python decorators generalmente funciona de esta manera:

class decorator(obj): 
    def __init__(self, f): 
     self.f = f 
    def __call__(self, *args, **kwargs): 
     print "Before" 
     self.f() 
     print "After" 

@decorator 
def func1(): 
    print "Function 1" 

@decorator 
def func2(): 
    print "Function 2" 

Calling func1 y resultaría entonces func2 en

 
Before 
Function 1 
After 
Before 
Function 2 
After 

La idea es que los decoradores me permiten agregar fácilmente tareas comunes en los puntos de entrada y salida de múltiples funciones.

+0

Encontré esto una introducción interesante al por qué en lugar del qué. http://python.about.com/gi/dynamic/offsite.htm?zi=1/XJ&sdn=python&cdn=compute&tm=12&f=10&su=p284.9.336.ip_p504.1.336.ip_&tt=29&bt=0&bts=1&zu=http % 3A // www.python.org/doc/2.4.4/whatsnew/node6.html – ShuggyCoUk

+0

Hmm, esperaba algo ya integrado en el lenguaje, pero por las respuestas parece que no hay una forma directa de hacerlo sin agregar un nuevo marco. Mi proyecto es muy pequeño, así que probablemente sea excesivo hacerlo de esa manera. – jtjin

Respuesta

9

Puede hacerlo utilizando Post Sharp. Mira el video de demostración para obtener instrucciones.

+1

Post Sharp se ve bastante impresionante, pero agregar un marco a mi pequeño proyecto podría ser un poco exagerado para lo que necesitaba para los decoradores de funciones. Gracias de todos modos: D – jtjin

+0

Es muy simple, solo agrega una referencia y hereda un atributo. –

+0

También cuesta EUR329 después del período de prueba de 45 días. – Magnus

4

puede lograrlo por "ContextBoundObject" en .NET framework. pero es un poco intrincado porque básicamente usa la infraestructura .Net remota para interceptar llamadas a métodos. (la sobrecarga del tiempo de ejecución es mínima si sus llamadas se encuentran dentro del mismo dominio de aplicación, pero solo en un "contexto" diferente). por lo que los mejores enfoques serían los mencionados anteriormente por los otros carteles.

Cuestiones relacionadas