2013-02-10 10 views
5

मैं एक ऐसी विधि को उत्सर्जित करना चाहता हूं जिसमें एक चर है, जो मैं कर सकता हूं। लेकिन, मैं उस वैरिएबल में एक MethodInfo ऑब्जेक्ट को स्टोर करना चाहता हूं, जो एक अलग (गैर उत्सर्जित) विधि का संदर्भ है।मैं प्री-लोडेड MethodInfo स्थानीय चर के साथ एक विधि कैसे उत्सर्जित करूं?

मैं ओपोड्स को कॉल टाइपफॉफ़ (someClass) को कॉल करने के लिए उत्सर्जित कर सकता हूं। GetMethod (...), लेकिन यह अधिक कुशल होगा अगर मैं इस विधिInfo के लिए केवल टोकन लोड कर सकता हूं और इसे सीधे चर में सेंक सकता हूं।

तो, रीफ्रेज करने के लिए, मैं इसे छोड़ने के लिए संभव से बाहर निकलने की कोशिश कर रहा हूं, आइए एक "लोड ऑब्जेक्ट" ऑपोड कहें और इसे एमिट-टाइम पर ऑब्जेक्ट पास करें जिसे रनटाइम पर स्टैक पर लोड किया जाएगा। (OpCodes.Ldobj ने कोशिश की जब मैंने कुछ प्रकार की त्रुटि दी)। या, क्या मुझे opcodes उत्सर्जित करने के लिए मजबूर किया गया है जो रनटाइम पर ऐसा करेगा?

+0

मुझे लगता है कि यह संभव है। एरिक लिपर्ट ने एक बार सी # ऑपरेटर की संभावित जानकारी के बारे में ब्लॉग किया जो इसका उपयोग करेगा। – usr

+0

क्या आप मेरे कारण/हमारे लिए समस्या को थोड़ा स्पष्ट बनाने के लिए पीछे कारण पर थोड़ा संदर्भ दे सकते हैं? –

+0

@usr [जिस लेख के बारे में आप बात कर रहे हैं] (http://blogs.msdn.com/b/ericlippert/archive/2009/05/21/in-foof-we-trust-a-dialogue.aspx) है 'जानकारी' की वाक्य रचनात्मक समस्याओं के बारे में, यह कैसे लागू किया जा सकता है। – svick

उत्तर

8

आप आईएल में किसी भी सामान्य वस्तु को लोड नहीं कर सकते हैं, क्योंकि आईएल में इसे स्टोर करने का कोई तरीका नहीं है (string जैसे कुछ विशेष प्रकार के अपवाद के साथ)। आप serialization (इसका समर्थन करने वाले प्रकारों के लिए) का उपयोग करके उस पर काम कर सकते हैं, लेकिन मुझे नहीं लगता कि आप यही चाहते हैं। इसके अलावा, ldobj काफी अलग उद्देश्य प्रदान करता है।

लेकिन आप MethodInfo के लिए ऐसा कर सकते हैं जो typeof ऑपरेटर के लिए सी # के समान है। इसका मतलब है कि:

  1. ldtoken अनुदेश का उपयोग कर एक RuntimeMethodHandle
  2. MethodBase.GetMethodFromHandle() बुला MethodInfo

पूरे कोड के लिए एक MethodBase

  • डाली इसे पाने के लिए प्राप्त करने के लिए एक विधि है कि MethodInfo रिटर्न उत्पन्न करने के लिए इस तरह दिख सकता है:

    MethodInfo loadedMethod = …; 
    var getMethodMethod = typeof(MethodBase).GetMethod(
        "GetMethodFromHandle", new[] { typeof(RuntimeMethodHandle) }); 
    
    var createdMethod = new DynamicMethod(
        "GetMethodInfo", typeof(MethodInfo), Type.EmptyTypes); 
    
    var il = createdMethod.GetILGenerator(); 
    il.Emit(OpCodes.Ldtoken, loadedMethod); 
    il.Emit(OpCodes.Call, getMethodMethod); 
    il.Emit(OpCodes.Castclass, typeof(MethodInfo)); 
    il.Emit(OpCodes.Ret); 
    
    var func = (Func<MethodInfo>)createdMethod.CreateDelegate(typeof(Func<MethodInfo>)); 
    Console.WriteLine(func()); 
    
  • +0

    पूरी तरह से काम किया! –

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