2012-03-21 17 views
5

क्या आईएल जनरेटर के साथ जेनरिक का उपयोग करना संभव है?जेनरिक?

 DynamicMethod method = new DynamicMethod(
      "GetStuff", typeof(int), new Type[] { typeof(object) }); 

     ILGenerator il = method.GetILGenerator(); 

     ... etc 
+1

संभव डुप्लिकेट http: मान लिया जाये कि method एक MethodInfo या MethodBuilder उद्देश्य यह है कि एक सामान्य विधि परिभाषा का वर्णन करता है, तो आप एक फोन है कि विधि के लिए एक सामान्य पैरामीटर int साथ इस प्रकार का उत्सर्जन कर सकते हैं : //stackoverflow.com/questions/788618/dynamicmethod-with-generic-type-parameters) –

+0

यह आपके प्रश्न से स्पष्ट नहीं है: क्या आप एक सामान्य विधि बनाना चाहते हैं या बस इसके अंदर कुछ सामान्य प्रकार (या विधि) का उपयोग करना चाहते हैं? – svick

+0

@svick: मैं गतिशील रूप से एक सामान्य विधि बनाना चाहता हूं। – sgtz

उत्तर

8

हां, यह संभव है, लेकिन DynamicMethod कक्षा के साथ नहीं। यदि आप इस कक्षा का उपयोग करने के लिए प्रतिबंधित हैं, तो आप भाग्य से बाहर हैं। यदि आप इसके बजाय MethodBuilder ऑब्जेक्ट का उपयोग कर सकते हैं, तो पढ़ें।

एक सामान्य विधि के शरीर को उत्सर्जित करना, अधिकांश उद्देश्यों और उद्देश्यों के लिए, अन्य विधियों के शरीर को उत्सर्जित करने से अलग नहीं है, सिवाय इसके कि आप सामान्य प्रकार के स्थानीय चर बना सकते हैं। यहाँ एक सामान्य विधि सामान्य तर्क टी के साथ MethodBuilder का उपयोग कर बनाने और प्रकार टी की एक स्थानीय बनाने का एक उदाहरण है:

MethodBuilder method; 
//... Leaving out code to create MethodBuilder and store in method 
var genericParameters = method.DefineGenericParameters(new[] { "T" }); 
var il = method.GetILGenerator(); 
LocalBuilder genericLocal = il.DeclareLocal(genericParameters[0]); 

किसी अन्य विधि से कि सामान्य विधि के लिए एक कॉल का उत्सर्जन करने के लिए, इस कोड का उपयोग।

il.EmitCall(OpCodes.Call, method.MakeGenericMethod(typeof(int)), new[] { typeof(int) })); 
[सामान्य प्रकार पैरामीटर के साथ DynamicMethod] (की
+1

'GetGenericArguments()' को कॉल करने के बजाय आप 'DefineGenericParameters()' द्वारा लौटाई गई सरणी का उपयोग कर सकते हैं। – svick

+0

धन्यवाद, मुझे यह नहीं पता था। यह अभी तय है। – aboveyou00

+0

धन्यवाद @svick और उपरोक्त। मैंने एसओ पर पढ़ा कि यह संभव नहीं था, और किसी भी तरह से पूछने के लिए सोचा - मुझे आशा थी कि वह जानकारी पिछले .NET के पिछले संस्करण के लिए हो सकती है। – sgtz

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