2012-06-14 21 views
6

पर विधि निष्पादित करें मुझे यकीन है कि इस प्रश्न का उत्तर कहीं दिया गया है लेकिन मुझे खोजने के लिए कीवर्ड के सही संयोजन को खोजने में बड़ी समस्याएं हैं।गतिशील

dynamic someObj = new SomeObject(); 

var methodName = "someMethodName"; 

// execute methodName on someObj 

मैं मूल रूप से अपनी यदि संभव हो तो एक चर कि तरीकों नाम संग्रहीत करता है का उपयोग करते हुए एक गतिशील वस्तु पर एक विधि निष्पादित करने के लिए जानना चाहता हूँ:

मैं अपनी यदि संभव हो तो इस तरह कुछ करने के लिए पता करने के लिए उत्सुक हूँ।

+0

'ऑब्जेक्ट '' System.Object' कक्षा के लिए सी # उपनाम का नाम है; आपको इसका नाम बदलना चाहिए, कहें, 'obj'। – dasblinkenlight

+0

आप ऐसा क्यों करेंगे? उस विधि को ढूंढने के लिए आपको वेनिला प्रतिबिंब का उपयोग करना होगा। यदि आप ऐसा करने जा रहे हैं तो गतिशीलता का उपयोग करने में कोई बात नहीं है। –

+4

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

उत्तर

7

आप इसे पर ऑब्जेक्ट पर कर सकते हैं, आवश्यक नहीं dynamic एक reflection का उपयोग कर।

object obj = new SomeObject(); 
var meth = obj.GetType().GetMethod("someMethodName"); 
meth.Invoke(obj, new object[0]); // assuming a no-arg method 

जब आप dynamic उपयोग करते हैं, आप एक विधि नाम के लिए किसी भी पहचानकर्ता का उपयोग कर सकते हैं और संकलक शिकायत नहीं होगा:

dynamic obj = MakeSomeObject(); 
obj.someMethodName(); // Compiler takes it fine, even if MakeSomeObject returns an object that does not declare someMethodName() 
+1

+1, आश्चर्य की बात है कि GetType() गतिशील ऑब्जेक्ट पर काम करता है, लेकिन आपने इसे अपने समाधान – Milimetric

+1

@Milimetric में सूचीबद्ध नहीं किया है: "गतिशील वस्तु" जैसी कोई चीज़ नहीं है। 'गतिशील' चर नियमित वस्तुओं को पकड़ते हैं। यह 'IDynamicMetaObject' के साथ काम नहीं करेगा। – SLaks

+0

मेरा मतलब था 'var' या' DansAwesomeClass' – Milimetric

2

ठीक है, आपको वास्तव में उद्धरणों में "someMethodName" की आवश्यकता नहीं है। तुम सिर्फ इस (पूरा कार्यक्रम सूची) कार्य करें:

class Program 
{ 
    static void Main(string[] args) 
    { 
     dynamic obj = new SomeObject(); 
     obj.someMethodName("hello"); 
    } 
} 

public class SomeObject 
{ 
    public void someMethodName(string message) 
    { 
     Console.WriteLine(message); 
    } 
} 

मामले में अपने विधि नाम जावास्क्रिप्ट या कुछ और की तरह कुछ बुराई जगह से आता है, तो आप ऐसा कर सकते हैं:

class Program 
{ 
    static void Main(string[] args) 
    { 
     dynamic obj = new SomeObject(); 
     var meth = obj.GetType().GetMethod("someMethodName"); 
     meth.Invoke(obj, new object[1]{"hello"}); 
    } 
} 

public class SomeObject 
{ 
    public void someMethodName(string message) 
    { 
     Console.WriteLine(message); 
    } 
} 
+0

धन्यवाद, सवाल जावास्क्रिप्ट से आता है। मैं सिग्नलआर यांत्रिकी को समाहित करने की कोशिश कर रहा हूं, इस तरह यह समस्या स्वयं को – devshorts

+1

कूल प्रस्तुत करती है :) अच्छी तरह से आश्चर्य की बात यह है कि आप गतिशील वस्तु पर GetType() को कॉल कर सकते हैं। लेकिन इस मामले में, मुझे लगता है कि आपके द्वारा स्वीकार किया गया उत्तर बेहतर है क्योंकि आप केवल एक सादे पुराने जेनेरिक सिस्टम का उपयोग कर रहे हैं। गतिशील के विपरीत ऑब्जेक्ट करें जो हल्के वजन के रूप में नहीं हो सकता है। ओह, और गतिशीलता को डीबग करना कठिन है - मैंने घड़ी में गतिशीलता जोड़ने के दौरान कुछ बार विजुअल स्टूडियो को क्रैश करने में कामयाब रहा है – Milimetric

1

अपनी टिप्पणी के आधार पर, एक स्ट्रिंग का उपयोग कर सिग्नलआर गतिशील क्लाइंट प्रॉक्सी के कार्यों को कॉल करने में सक्षम होना आवश्यक है। ऐसा करने के लिए प्रतिबिंब का उपयोग करने की कोशिश कर रहा है, यानी: .GetType().GetMethod(functionName) काम नहीं करता है, क्योंकि यह किसी गतिशील वस्तु के लिए नहीं होगा।

हालांकि यह गतिशील ऑब्जेक्ट की Invoke विधि का उपयोग करके किया जा सकता है।

var functionName = "alertAllUsers"; 
var message = "Hello!"; 
var groupID = "1"; 

var connection = GlobalHost.ConnectionManager.GetHubContext<SomeHub>(); 
connection.Clients.Group(groupID).Invoke(functionName, message);