2012-11-21 11 views
7

तो, मैंने हाल ही में कुछ प्रयोग किया और पाया कि ऐसा लगता है कि प्रतिबिंब। प्रवेश ईसीएमए स्पेक में सभी ऑपकोड का समर्थन नहीं करता है। इसमें 3 opcodes लापता हैं:क्या प्रतिबिंब का उपयोग करना संभव है। Opcodes stelem.any और ldelem.any के लिए प्रवेश करें?

  • ldelem.any
  • stelem.any
  • no. (उपसर्ग)

इन opcodes सिर्फ प्रतिबिंब एपीआई में समर्थित नहीं हैं, या वहाँ किसी तरह उन्हें उत्पन्न करने के लिए है या कुछ कुछ?

+0

मुझे पूरा यकीन है कि यह है।मुझे जांचने दो; पी – leppie

+0

@leppie उन ऑपोड्स ओपकोड संग्रह में नहीं हैं – Earlz

+0

Unbox_Any वहाँ है; पी संपादित करें: कम से कम – leppie

उत्तर

1

वास्तव में, आप कर सकते हैं।

वहाँ http://msdn.microsoft.com/en-us/library/4xxf1410.aspx पर एक अद्भुत पूर्वाभ्यास है

दो आवश्यक भागों हैं:

string[] typeParamNames = {"TFirst", "TSecond"}; 
GenericTypeParameterBuilder[] typeParams = 
    myType.DefineGenericParameters(typeParamNames); 

GenericTypeParameterBuilder TFirst = typeParams[0]; 
GenericTypeParameterBuilder TSecond = typeParams[1]; 

तो विधि बनाने के लिए::

सामान्य पैरामीटर बनाएं

Type listOf = typeof(List<>); 
Type listOfTFirst = listOf.MakeGenericType(TFirst); 
Type[] mParamTypes = {TFirst.MakeArrayType()}; 

MethodBuilder exMethod = 
    myType.DefineMethod("ExampleMethod", 
     MethodAttributes.Public | MethodAttributes.Static, 
     listOfTFirst, 
     mParamTypes); 

हालांकि, आपको जेनर के रूप में पूरी तरह से इसे पार करना चाहिए आईसी पैरामीटर का उपयोग कई अलग-अलग तरीकों और खंडों में किया जाता है (विधि पर, पैरामीटर पर, परिणाम प्रकार के रूप में, जब invoking, ...)।

-update- और आप नेट 2 विशेष संस्करण चाहते हैं: http://msdn.microsoft.com/en-us/library/4xxf1410%28v=vs.80%29.aspx

पृष्ठ पर लटकती की मदद से आप ढांचा है जिसमें आप यह कर सकते हैं के कई संस्करणों का चयन करें।

+0

उम ... क्या यह सही प्रश्न का उत्तर है? – IllidanS4

+0

@ IllidanS4 मैंने संपादन से पहले इस प्रश्न का उत्तर दिया। यह शायद सवाल का जवाब नहीं देता है क्योंकि यह अभी खड़ा है, लेकिन उम्मीद है कि यह अभी भी कुछ लोगों के लिए उपयोगी है, इसलिए मैं इसे हटाने के लिए उत्सुक नहीं हूं। देखते हुए मैंने 3 साल पहले इसका उत्तर दिया, मुझे नहीं पता कि उस समय मेरी विचार प्रक्रिया क्या थी। –

0

मैं कम से कम .net 4 का अनुवाद STO में लेकिन OpCode.Stelem अनुदेश इस बारे में एक टिप्पणी रखा एक stelem.any

यह मामला है कि आप प्रकार आप सरणी में और के लिए भंडारण कर रहे थे सांकेतिक शब्दों में बदलना पड़ा होने के लिए उपयोग करें देखें प्राइमेटिव्स विभिन्न stelem.* ऑपकोड थे। यदि आप संदर्भ प्रकार संग्रहीत कर रहे थे (कुछ जो प्रतिनिधि या वर्ग के रूप में घोषित किया गया था) तो आप stelem.Ref का उपयोग करेंगे और आप मूल्य प्रकारों के लिए Stelem (myType) का उपयोग करेंगे (कुछ जिसे संरचना या enum के रूप में घोषित किया जाता है)।

हालांकि, जेनेरिक के आगमन के साथ टाइप पैरामीटर आया और यह कुछ भी हो सकता था। T एक संदर्भ प्रकार हो सकता है या यह एक मूल्य प्रकार हो सकता है। इसलिए stelem.any इस असामान्य मामले को संभालने के लिए पैदा हुआ है। लेकिन आप कह सकते हैं, मैं केवल एक अनबॉक्स किए गए टी को एक टी सरणी में स्टोर कर सकता हूं, इसलिए यह पूरी तरह से व्यर्थ है, क्या हम केवल सरणी के प्रकार पर भरोसा नहीं कर सकते हैं?

वैसे सरणी का प्रकार भी सामान्य हो सकता है, जो चीजों को बल्कि कठिन बना देगा। लेकिन अधिक महत्वपूर्ण बात यह है कि इसके कन्वर्स ऑपरेशन भी अगले ऑपरेशन को सत्यापित करने में मदद करता है।

ldarg.0 
ldc.i4.0 
ldelem.any !!T 

सत्यापनकर्ता कि इस ढेर में संक्रमण के बाद अगले निर्देश एक अनबॉक्स्ड टी जो सामान्य तरीकों पैरामीटर है पर संचालित किया जाना चाहिए कहता है।

+0

इनमें से कोई भी मुझे नहीं बताता है कि क्या आप इसे प्रतिबिंब.मेट के साथ कर सकते हैं, आपने समझाया कि क्यों ldelem.any जोड़ा गया था, लेकिन यह नहीं कि कैसे reflection.emit के साथ ऐसा करता है। – trampster

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

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