2008-09-18 13 views
9

क्या सिस्टम के माध्यम से कोई तरीका है। रिफ्लेक्शन, सिस्टम। डायग्नोस्टिक्स या अन्य वास्तविक उदाहरण का संदर्भ प्राप्त करने के लिए जो विधि में इसे पास किए बिना स्थिर विधि को कॉल कर रहा है?क्या मुझे प्रतिबिंब/निदान के माध्यम से एक विधि के भीतर कॉलिंग उदाहरण मिल सकता है?

इन पंक्तियों

class A 
{ 
    public void DoSomething() 
    { 
     StaticClass.ExecuteMethod(); 
    } 
} 

class B 
{ 
    public void DoSomething() 
    { 
     SomeOtherClass.ExecuteMethod(); 
    } 
} 
public class SomeOtherClass 
{ 
    public static void ExecuteMethod() 
    { 
     // Returns an instance of A if called from class A 
     // or an instance of B if called from class B. 
     object caller = getCallingInstance(); 
    } 
} 

मैं प्रकार System.Diagnostics.StackTrace.GetFrames का उपयोग कर प्राप्त कर सकते हैं, लेकिन वहाँ एक तरह से वास्तविक उदाहरण के लिए एक संदर्भ पाने के लिए है के साथ उदाहरण के लिए

, कुछ?

मुझे प्रतिबिंब और प्रदर्शन के साथ-साथ स्थैतिक कॉल के लिए स्थिर मुद्दों के बारे में पता है, और यह आम तौर पर लगभग असंभव है, इस तक पहुंचने का सही तरीका नहीं है। इस सवाल के कारण का हिस्सा है कि अगर यह करने योग्य था तो मैं उत्सुक था; हम वर्तमान में उदाहरण गुजर रहे हैं।

ExecuteMethod(instance) 

और अगर यह संभव है और अभी भी उदाहरण का उपयोग करने में सक्षम होने था मैं तो बस सोचा।

ExecuteMethod() 

@Steve कूपर: मैं विस्तार तरीकों पर विचार नहीं किया था। उसमें से कुछ भिन्नता काम कर सकती है।

उत्तर

4

मुझे विश्वास नहीं है कि आप कर सकते हैं। यहां तक ​​कि स्टैकट्रेस और स्टैकफ्रेम कक्षाएं आपको नामकरण जानकारी देती हैं, उदाहरणों तक पहुंच नहीं।

मुझे यकीन नहीं है कि आप ऐसा क्यों करना चाहते हैं, लेकिन पता है कि यदि आप इसे कर सकते हैं तो भी यह बहुत धीमा होगा।

ExecuteMethod को कॉल करने से पहले एक बेहतर समाधान उदाहरण को थ्रेड स्थानीय संदर्भ में धक्का देना होगा जिसे आप इसके भीतर पुनर्प्राप्त कर सकते हैं या बस आवृत्ति पास कर सकते हैं।

1

बस निष्पादन विधि एक वस्तु ले लो। तब आपके पास कोई फर्क नहीं पड़ता कि कोई फर्क नहीं पड़ता।

8

विधि को एक विस्तार विधि बनाने पर विचार करें। यह परिभाषित के रूप में:

public static StaticExecute(this object instance) 
{ 
    // Reference to 'instance' 
} 

ऐसा लगता है कि कहा जाता है:

this.StaticExecute(); 

मैं आपके द्वारा सीधे तौर करना चाहते हैं के लिए एक रास्ता नहीं सोच सकते हैं, लेकिन मैं केवल सुझाव दे सकते हैं कि आप कुछ पाते हैं , आप स्थैतिक विधियों के लिए देखते हैं, जिनमें एक नहीं होगा, और अज्ञात विधियां, जिनमें स्वत: जेनरेट किए गए वर्गों के उदाहरण होंगे, जो थोड़ा अजीब होगा।

मुझे आश्चर्य है कि आपको केवल उचित पैरामीटर के रूप में invoking ऑब्जेक्ट को पास करना चाहिए या नहीं। आखिरकार, static एक संकेत है कि यह विधि इसके इनपुट पैरामीटर के अलावा किसी अन्य चीज़ पर निर्भर नहीं है। यह भी ध्यान रखें कि यह विधि परीक्षण करने के लिए एक कुतिया हो सकती है, क्योंकि आपके द्वारा लिखे गए किसी भी टेस्ट कोड में चलने वाली प्रणाली के समान ऑब्जेक्टिंग ऑब्जेक्ट नहीं होगा।

+1

यह समस्या हल करने के लिए यह बहुत ही शानदार तरीका है – ohmusama

0

मुझे लगता है कि मुझे कुछ याद आ रहा है, यहां। स्थिर विधि को सचमुच कहीं से भी कहा जा सकता है। इस बात की कोई गारंटी नहीं है कि क्लास ए या क्लास बी इंस्टेंस कॉल स्टैक में कहीं भी दिखाई देगा।

जो कुछ भी आप करने की कोशिश कर रहे हैं उसे पूरा करने के लिए एक बेहतर तरीका होना चाहिए।

1

अपनी स्थैतिक विधि को कॉल करने वाली स्थैतिक विधि के मामले में, कोई कॉलिंग उदाहरण नहीं है।

जो भी आप करने की कोशिश कर रहे हैं उसे पूरा करने के लिए एक अलग तरीका खोजें।

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