2012-07-26 12 views
5

प्रारंभ करने में मैं कोड जो गतिशील SoapHttpClientProtocol वस्तु (प्रॉक्सी वर्ग) को दर्शाता है और WS-बेसिक मैं वेब सेवा के लिए कॉल करने के लिए इस वस्तु का उपयोग करता है के साथ काम कर रहा हूँ। यहाँ मेरी कोड का सरलीकृत संस्करण है:उपयोग संकलित लैम्ब्डा Activator.CreateInstance के बजाय अभिव्यक्ति SoapHttpClientProtocol वस्तु

public override object Call(Type callingObject, 
string method, object[] methodParams, string URL) 
{ 
    MethodInfo requestMethod = callingObject.GetMethod(method); 

    //creates an instance of SoapHttpClientProtocol 
    object instance = Activator.CreateInstance(callingObject); 

    //sets the URL for the object that was just created 
    instance.GetType().InvokeMember("Url", 
    BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty, null, 
    instance, 
    new object[1] {URL}); 

    return requestMethod.Invoke(instance, methodParams); 
} 

मैंने देखा है कि कुछ मामलों में Activator.CreateInstance() कॉल समय की महत्वपूर्ण राशि ले जा सकते हैं, तो मैं कोड by using a lambda expression अनुकूलन करने के लिए कोशिश कर रहा हूँ:

public override object Call(Type callingObject, 
string method, object[] methodParams, string URL) 
{ 
    MethodInfo requestMethod = callingObject.GetMethod(method); 

    //creates an instance of SoapHttpClientProtocol using compiled Lambda Expression 
    ConstructorInfo constructorInfo = callingObject.GetConstructor(new Type[0]); 
    object instance = Expression.Lambda(Expression.New(constructorInfo)).Compile(); 

    //sets the URL for the object that was just created 
    instance.GetType().InvokeMember("Url", 
    BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty, null, 
    instance, 
    new object[1] {URL}); 

    //calls the web service 
    return requestMethod.Invoke(instance, methodParams); 
} 

दुर्भाग्य से, इस कोड callingObject प्रकार का ऑब्जेक्ट का निर्माण नहीं करता (बजाय इसे एक Func<T> प्रतिनिधि ऑब्जेक्ट) और इसलिए जब यह अगली पंक्ति में Url सेट करने का प्रयास यह एक अपवाद फेंकता है:

सिस्टम। MissingMethodException: अनुपलब्ध सदस्य तक पहुंचने का प्रयास किया गया।

क्या मुझे अपने कोड में कुछ याद आ रही है?

धन्यवाद!

+0

लिंक – NStuke

उत्तर

3

Expression.Lambda(Expression.New(constructorInfo)).Compile() भाग Func<T> प्रतिनिधि देता है जो callingObject पैरामीटर में संग्रहीत Type के निर्माता को लपेटता है। करने के लिए वास्तव में कॉल कि निर्माता, आप अभी भी इसे लागू करने की जरूरत है:,

Delegate delegateWithConstructor = Expression.Lambda(Expression.New(constructorInfo)).Compile(); 
object instance = delegateWithConstructor.DynamicInvoke(); 

हालांकि तुम क्या करने की कोशिश कर रहे हैं, काफी अजीब और लंबे समय में कमजोर लगता है जब से तुम सरल तारों के रूप में विधि के नाम के आसपास से गुजर रहे हैं और ऑब्जेक्ट्स के रूप में पैरामीटर, इसलिए सभी संकलन-समय प्रकार की जांच खोना। आपको ऐसा करने की ज़रूरत क्यों है?

+0

+1, लघु और सरल तरीके से मर चुका है। लेकिन वापस 'प्रतिनिधि' क्यों लेते हैं और गतिशील आह्वान करते हैं? क्यों न केवल 'Func' और फिर()? – nawfal

0

अभिव्यक्ति वृक्षों का उपयोग करने से आपके प्रोग्राम धीमे चलने का कारण बनेंगे जब तक आप संकलित अभिव्यक्ति कैश नहीं करते।

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