2011-03-23 15 views
10

पर कॉल करने वाले उदाहरण को कैसे प्राप्त करें मेरे पास एक क्रिया है और मुझे आश्चर्य है कि मैं विधि को कॉल करने वाले उदाहरण को कैसे एक्सेस कर सकता हूं।कार्य प्रतिनिधि। विधि

उदाहरण:

this.FindInstance(() => this.InstanceOfAClass.Method()); 
this.FindInstance(() => this.InstanceOfAClass2.Method()); 
this.FindInstance(() => this.InstanceOfAClass3.Method()); 



    public void FindInstance(Action action) 
    { 
     // The action is this.InstanceOfAClass.Method(); and I want to get the "Instance" 
     // from "action" 
    } 

धन्यवाद

उत्तर

8

मुझे लगता है कि आप Delegate.Target संपत्ति के लिए देख रहे हैं।

संपादित करें: ठीक है, अब मैं देख रहा हूं कि आप क्या कर रहे हैं, और आपको कार्रवाई का प्रतिनिधित्व करने वाले अभिव्यक्ति वृक्ष की आवश्यकता है। तो फिर तुम एक और अभिव्यक्ति पेड़ के रूप में विधि कॉल का लक्ष्य प्राप्त कर सकते हैं कि एक से LambdaExpression निर्माण, संकलन और निष्पादित, और परिणाम देखें:

using System; 
using System.Linq.Expressions; 

class Test 
{ 
    static string someValue; 

    static void Main() 
    { 
     someValue = "target value"; 

     DisplayCallTarget(() => someValue.Replace("x", "y")); 
    } 

    static void DisplayCallTarget(Expression<Action> action) 
    { 
     // TODO: *Lots* of validation 
     MethodCallExpression call = (MethodCallExpression) action.Body; 

     LambdaExpression targetOnly = Expression.Lambda(call.Object, null); 
     Delegate compiled = targetOnly.Compile(); 
     object result = compiled.DynamicInvoke(null); 
     Console.WriteLine(result); 
    } 
} 

ध्यान दें कि यह अविश्वसनीय रूप से भंगुर है - लेकिन यह में काम करना चाहिए साधारण मामले

+0

नहीं है, Delegate.Target वर्ग जहां कार्रवाई लागू किया गया है। मैं उस इंस्टेंस को चाहता हूं जो विधि को कॉल करता है। –

+0

@ जीन उस मामले में मुझे समझ में नहीं आता कि आप क्या कर रहे हैं। कृपया एक छोटा लेकिन * पूरा * उदाहरण –

+0

@ जीन प्रदान करें: कारण यह आपके लिए काम नहीं कर रहा है, क्योंकि आप विधि कॉल को एक बेकार लैम्ब्डा में लपेटेंगे। 'FindInstance (InstanceOfAClass.Method)' (कोई lambda) आज़माएं और यह आपकी इच्छा के अनुसार काम करेगा। यदि आप इसे लैम्ब्डा सिंटैक्स के साथ काम करना चाहते हैं, तो आपको 'अभिव्यक्ति ' प्रकार का पैरामीटर स्वीकार करना होगा और अभिव्यक्ति वृक्ष को चलाना होगा। –

3

असल में मुझे नहीं पता कि आप इसे इस तरह से कर सकते हैं या नहीं। Delegate कक्षा में केवल दो गुण हैं: Target और MethodTarget तक पहुंच नहीं होगी क्योंकि आप एक नई अनाम विधि बना रहे हैं, इसलिए संपत्ति उस कक्षा को वापस कर देगी जिसमें FindInstance विधि कहा जाता है। इस के बजाय तरह

कोशिश कुछ: इस प्रकार

FindInstance(this.MyInstance.DoSomething); 

और फिर Target संपत्ति का उपयोग:

public void FindInstance(Action action) 
{ 
    dynamic instance = action.Target; 
    Console.WriteLine(instance.Property1); 
} 
+0

क्षमा करें, लेकिन लक्ष्य उदाहरण नहीं है लेकिन उदाहरण के बारे में जानकारी है। – Jacob

संबंधित मुद्दे