2010-06-24 16 views
15

द्वारा कॉल विधि के प्रतिबिंब का उपयोग कैसे करें हाय मैं पैरामीटर पारित करने वाली विधि को कॉल करने के लिए सी # प्रतिबिंब का उपयोग करने की कोशिश कर रहा हूं और बदले में परिणाम वापस पास हो जाता है। मैं उसे कैसे कर सकता हूँ? मैंने कुछ चीजों की कोशिश की है लेकिन बिना किसी सफलता के। मैं PHP और पायथन के लिए उपयोग किया जाता है जहां यह एक लाइन पर किया जा सकता है, इसलिए यह मेरे लिए बहुत भ्रमित है।नाम

request.UserId = (long)Constants.defaultAmbience["UserId"]; 
request.Ambience.CountryId = (long[])Constants.defaultAmbience["CountryId"]; 
request.Ambience.Name.DefaultText = (string)Constants.defaultAmbience["NameDefaultText"]; 
request.Ambience.Name.LanguageText = GetCultureTextLanguageText((string)Constants.defaultAmbience["NameCulture"], (string)Constants.defaultAmbience["NameText"]); 
request.Ambience.Description.DefaultText = (string)Constants.defaultAmbience["DescriptionText"]; 
request.Ambience.Description.LanguageText = GetCultureTextLanguageText((string)Constants.defaultAmbience["DescriptionCulture"], (string)Constants.defaultAmbience["DescriptionDefaultText"]); 

यह जहां मामले के लिए serviceAction ऊपर प्रतिबिंब लागू करने के लिए मेरी समारोह है:

response = service.CreateAmbience(request); 

अनुरोध इन वस्तुओं है:

संक्षेप में यह कैसे कॉल प्रतिबिंब के बिना किया जाएगा है "CreateAmbience" होगा:

public static R ResponseHelper<T,R>(T request, String serviceAction) 
{ 
    ICMSCoreContentService service = new ContentServiceRef.CMSCoreContentServiceClient(); 
    R response = default(R); 
    response = ??? 
} 

उत्तर

41

कुछ के साथ कुछ:

MethodInfo method = service.GetType().GetMethod(serviceAction); 
object result = method.Invoke(service, new object[] { request }); 
return (R) result; 

आप अच्छी तरह से हर स्तर पर जांच करता है जोड़ने के लिए हालांकि,, यह सही पैरामीटर प्रकार है कि यकीन है कि प्रश्न में विधि वास्तव में वैध है बनाने के लिए चाहते हो सकता है, और यह सही वापसी प्रकार मिला है कि। हालांकि आपको शुरू करने के लिए यह पर्याप्त होना चाहिए।

Type thisType = <your object>.GetType(); 
MethodInfo theMethod = thisType.GetMethod(<The Method Name>); 
theMethod.Invoke(this, <an object [] of parameters or null>); 
+0

धन्यवाद जॉन, मैं अभी कोशिश कर रहा हूं लेकिन मैं ge लाइन पर एक त्रुटि "ऑब्जेक्ट परिणाम = method.Invoke (सेवा, नई वस्तु [] {अनुरोध});" पैरामीटर गिनती मेल नहीं खाते। – Martin

+0

मैंने इसे हल कर लिया है। आपका समाधान काम करता है लेकिन प्रतिबिंब सेवा रैपर नहीं उठा रहा था जो 1 तर्क लेता था। आपकी सहायता के लिए धन्यवाद. – Martin

9

यहाँ नाम से एक वस्तु विधि बुला प्रतिबिंब का उपयोग करने का एक त्वरित उदाहरण है

dynamic dService = service; 
var response = dService.CreateAmbience(request); 
3

आप .NET 4 पर हैं, तो का उपयोग dynamic:

3

आप Delegate.CreateDelegate उपयोग कर सकते हैं प्राप्त करने के लिए नाम से विधि के लिए एक प्रतिनिधि:

public static R ResponseHelper<T,R>(T request, string serviceAction) 
{ 
    var service = new ContentServiceRef.CMSCoreContentServiceClient(); 

    var func = (Func<T,R>)Delegate.CreateDelegate(typeof(Func<T,R>), 
                service, 
                serviceAction); 

    return func(request); 
} 
संबंधित मुद्दे