2011-02-01 13 views
5

क्या सी # में पारदर्शी रूप से अन्य विधियों में तरीकों को लपेटने का कोई तरीका है? मैं मूस की कार्यक्षमता के अनुसार क्या हासिल करना चाहता हूं: http://search.cpan.org/perldoc?Moose::Manual::MethodModifiersसी #: अन्य विधियों में लपेटने के तरीके

संपादित करें: और पारदर्शी से मेरा मतलब मूल विधि को संशोधित किए बिना है।

+0

आप शायद कुछ निफ्टी प्रतिबिंब के साथ कर सकते हैं, लेकिन मुझे नहीं लगता कि यह सुंदर होगा ... – Alxandr

उत्तर

4

मुझे लगता है कि आप क्या पहलू उन्मुख प्रोग्रामिंग करार दिया है के लिए देख रहे हैं। इसके साथ मदद करने के लिए कई सी # पुस्तकालय हैं। एक को PostSharp कहा जाता है (PostSharp का मुफ्त संस्करण इस कार्यक्षमता का समर्थन करता है)। यहां मूस उदाहरण के समान उदाहरण है। उसके ठीक पहले वाले

[Serializable] 
public class TraceAttribute : OnMethodBoundaryAspect 
{ 

    public override void OnEntry(MethodExecutionArgs args) 
    { 
     Trace.WriteLine("about to call method"); 
    } 

    public override void OnExit(MethodExecutionArgs args) 
    { 
     Trace.WriteLine("just finished calling method"); 
    } 
} 

आप विधि "फू" के लिए यह जोड़ना होगा ट्रेस रखकर विशेषता:: यह एक ट्रेस गुण है जो आप अन्य तरीकों पर उपयोग कर सकते हैं इस अतिरिक्त कार्यक्षमता पर हमले के लिए बनाता है

[Trace] 
public void Foo() { /* ... */ } 

अब जब फू निष्पादित होता है, तो उपर्युक्त ऑनएन्ट्री विधि इससे पहले चली जाएगी, और ऑनएक्सिट ठीक बाद में चलेगा।

+0

क्या मैं तर्क को संशोधित कर सकता हूं क्योंकि वे फ़ंक्शन में पास किए गए हैं? मैं देखता हूं कि मैं उन्हें प्राप्त करता हूं, लेकिन मैं दस्तावेज़ीकरण से नहीं कह सकता कि क्या मैं उन्हें बदल सकता हूं। – rpkelly

+0

@rpkelly - आप विशेष रूप से तर्कों के साथ क्या करने की उम्मीद कर रहे हैं? –

+0

खैर मुझे फ़ंक्शन और उसके रिटर्न मानों पर कॉल लॉग करने की आवश्यकता है, साथ ही फ़ंक्शन में पारित "लेनदेन आईडी" की स्वचालित पीढ़ी को संभालने की आवश्यकता है (जिसे वर्तमान में कहीं और जेनरेट किया गया है)। – rpkelly

2

दरअसल, उन्हें .NET में "प्रतिनिधि" कहा जाता है। देखें:

मदद के लिए

+2

बंद करें। लेकिन मुझे मूल विधि को फिर से लिखने के बिना इसे करने की ज़रूरत है। पारदर्शी द्वारा मेरा यही मतलब है। हालांकि, यह साफ है :) – rpkelly

0

नहीं, मूस में ऐसा नहीं किया गया है। आप कुछ एओपी पुस्तकालय में देखना चाह सकते हैं।

2

आप एक गतिशील प्रॉक्सी का उपयोग कर एक ही प्रभाव प्राप्त कर सकते हैं। एक उदाहरण Castle Dynamic Proxy है।

ऐसे ढांचे 'प्रॉक्सी' या 'रैपर' वर्गों के निर्माण के लिए सी # प्रतिबिंब सुविधाओं का लाभ उठाते हैं। इसलिए इस बात का ध्यान रखें। इस वजह से ओवरहेड की एक निश्चित राशि है। वैकल्पिक रूप से आप ढांचे का उपयोग कर सकते हैं जो create classes statically via code generation कर सकते हैं।

0

कुछ अलगाव पुस्तकालय कार्यक्षमता को कार्यान्वित करते हैं जो "detours" या नकली विधियों के साथ विधियों को कॉल करने की अनुमति देता है। आप उस अवरोध को लागू करने के लिए समान कार्यक्षमता का उपयोग करने में सक्षम हो सकते हैं जिसका आप उल्लेख कर रहे हैं। अधिक जानकारी के लिए निम्न की जांच करें:

Rhino Mocks stubs and mocks are only good for interfaces?

http://research.microsoft.com/en-us/projects/moles/

http://www.typemock.com/typemock-isolator-product3/