2009-04-25 17 views
7

सामान्य प्रकार पैरामीटर के साथ एक डायनामिक मोड को परिभाषित करना संभव है? मेथडबिल्डर श्रेणी में DefineGeneric पैरामीटर विधि है। क्या डायनामिक मोड में समकक्ष है? उदाहरण के लिए डायनेमिक मोड का उपयोग करके दिए गए झटका जैसे हस्ताक्षर के साथ विधि बनाना संभव है?जेनेरिक प्रकार पैरामीटर के साथ डायनेमिक मोड

void T Foo<T>(T a1, int a2) 
+1

आप गतिशील रूप से तो विधि बना रहे हैं आप प्रकार पता नहीं है जब आप विधि उत्पन्न? जो सामान्य गतिशील विधि रखने की आवश्यकता को हटा देगा? – Steven

+0

मैं थोड़ा दुभाषिया लिख ​​रहा हूं और मैं कार्यों को संकलित करने के लिए डायनामिक मोड का उपयोग करना चाहता हूं। भाषा में पैरामीट्रिक पॉलिमॉर्फिज्म के लिए समर्थन है और यह टाइप पैरामीटर का उपयोग करना अच्छा होगा और प्रत्येक पैरामीटर संयोजन के लिए अधिभार उत्पन्न नहीं करना होगा। – Alex

+1

देखें: समर्थन जोड़ने पर वोट करने के लिए https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2508820-dynamicmethod-to-support-generic-type-parameters-l वोट करने के लिए वोट दें। – cdiggins

उत्तर

2

असल में वहाँ है के लिए एक बार में एक ही DynamicMethod उत्पन्न करके एक तरीका, यह बिल्कुल सामान्य नहीं है लेकिन आपको यह विचार मिलेगा:

public delegate T Foo<T>(T a1, int a2); 

public class Dynamic<T> 
{ 
    public static readonly Foo<T> Foo = GenerateFoo<T>(); 

    private static Foo<V> GenerateFoo<V>() 
    { 
     Type[] args = { typeof(V), typeof(int)}; 

     DynamicMethod method = 
      new DynamicMethod("FooDynamic", typeof(V), args); 

     // emit it 

     return (Foo<V>)method.CreateDelegate(typeof(Foo<V>)); 
    } 
} 

आप इस तरह यह कॉल कर सकते हैं:

Dynamic<double>.Foo(1.0, 3); 
+0

असल में, यह कोई बुरा विचार नहीं है :)। अगर मैं कभी भी इस मुद्दे का सामना करता हूं तो मैं इसे ध्यान में रखूंगा। मैं उत्तर के रूप में आपका जवाब भी चुन रहा हूं क्योंकि यह मूल समस्या को हल करने के करीब आता है। धन्यवाद। – Alex

7

यह संभव हो सकता है यह मौजूद नहीं था: के रूप में आप को देखा है DynamicMethod कोई DefineGenericParameters विधि है, और यह अपने MethodInfo आधार वर्ग, जो सिर्फ NotSupportedException फेंकता से MakeGenericMethod इनहेरिट करती है।

संभावनाओं के एक जोड़े:

  • का उपयोग कर AppDomain.DefineDynamicAssembly
  • जेनरिक स्वयं करें एक पूरी गतिशील विधानसभा को परिभाषित करें, प्रकार तर्क के प्रत्येक सेट
+0

धन्यवाद। यही वह था जिसे मैं डरता था। मुझे लगता है कि कोई दूसरा रास्ता नहीं है। हालांकि डायनेमिक मोड के साथ इसका समर्थन करना अच्छा लगेगा। – Alex

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