2009-09-07 2 views
22

में फ़ंक्शन सजावटकर्ता क्या पाइथन के फ़ंक्शन सजावट के लिए सी # एनालॉग है? ऐसा लगता है कि यह गुणों और प्रतिबिंब ढांचे के साथ करने योग्य है, लेकिन मुझे रनटाइम पर फ़ंक्शंस को प्रतिस्थापित करने का कोई तरीका नहीं दिखता है।सी #

Python decorators आम तौर पर इस तरह से काम करते हैं:

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" 

func1 कॉलिंग और func2 तो परिणाम होगा

 
Before 
Function 1 
After 
Before 
Function 2 
After 

में विचार है कि सज्जाकार मुझे आसानी से प्रवेश और निकास बिंदुओं पर सामान्य कार्यों जोड़ने जाएगा कई कार्यों का।

+0

मुझे यह एक दिलचस्प परिचय मिला कि क्यों इसका विरोध किया गया। 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 % 3 ए // www.python.org/doc/2.4.4/whatsnew/node6.html – ShuggyCoUk

+0

हम्म, मैं भाषा में पहले से निर्मित कुछ की उम्मीद कर रहा था लेकिन उत्तर से ऐसा लगता है कि ऐसा करने का कोई सीधा तरीका नहीं है यह एक नया ढांचा जोड़ने के बिना। मेरी परियोजना बहुत छोटी है इसलिए शायद इसे इस तरह से करने के लिए अधिक है। – jtjin

उत्तर

9

आप Post Sharp का उपयोग करके ऐसा कर सकते हैं। निर्देशों के लिए डेमो वीडियो देखें।

+1

पोस्ट शार्प बहुत बढ़िया दिखता है, लेकिन मेरे छोटे प्रोजेक्ट में एक ढांचा जोड़ना मेरे लिए फ़ंक्शन सजावट की आवश्यकता के लिए थोड़ा अधिक हो सकता है। वैसे भी धन्यवाद: डी – jtjin

+0

यह वास्तव में सरल है, बस एक संदर्भ जोड़ना और एक विशेषता विरासत में मिलाकर। –

+0

45 दिनों की परीक्षण अवधि के बाद भी यह EUR329 खर्च करता है। – Magnus

12

जिस तरह से मैं इसे प्राप्त करता हूं AOP frameworksCastle Dynamic Proxy, Spring.NET या यहां तक ​​कि Policy Injection Application Block भी है।

+0

एओपी के पॉइंटर्स के लिए धन्यवाद - मुझे लगता है कि मेरी छोटी परियोजना में एक ढांचा जोड़ना थोड़ा सा हो सकता है, कम से कम मैं सजावटी को पहले स्थान पर चाहता था। फिर भी धन्यवाद :) – jtjin

4

आप .NET ढांचे में "ContextBoundObject" द्वारा प्राप्त कर सकते हैं। लेकिन यह थोड़ा सा संकुचित है क्योंकि यह मूल रूप से विधि कॉल को रोकने के लिए .NET remoting बुनियादी ढांचे का उपयोग करता है। (रनटाइम ओवरहेड न्यूनतम है यदि आपकी कॉल एक ही ऐप डोमेन के भीतर हैं लेकिन केवल "संदर्भ" में हैं)। तो अन्य पोस्टर्स द्वारा ऊपर वर्णित बेहतर दृष्टिकोण होंगे।