2012-03-12 20 views
14

सामान्य विधि है में पारित करने के लिए ...सी #: एक सामान्य विधि

public void PrintGeneric2<T>(T test) where T : ITest 
    { 
     Console.WriteLine("Generic : " + test.myvar); 
    } 

मैं मुख्य() से फोन कर रहा हूँ ...

Type t = test2.GetType();  
    PrintGeneric2<t>(test2); 

मैं कार्यावधि में प्रकार पैरामीटर प्राप्त करें त्रुटि प्राप्त करें "CS0246: प्रकार या नामस्थान नाम 'टी' नहीं मिला" और "CS1502: सर्वोत्तम अधिभारित विधि मिलान DoSomethingClass.PrintGeneric2 < टी> (टी) में अवैध तर्क हैं"

यह मेरे पिछले प्रश्न से संबंधित है यहाँ : C# : Passing a Generic Object

मैंने पढ़ा है कि जेनेरिक प्रकार को रनटाइम पर प्रतिबिंबित नहीं किया जा सकता है, प्रतिबिंब या methodinfo के उपयोग के बिना, लेकिन मैं इस उदाहरण में ऐसा करने के तरीके पर बहुत स्पष्ट नहीं हूं।

धन्यवाद तुम मुझे प्रबुद्ध अगर कर सकते हैं =)

उत्तर

0

बस फोन:

PrintGeneric2(test2); 

संकलक आप क्या गुजरती से <t> का अनुमान लगा होगा।

+1

आपका सुझाव संकलक को टी को सिस्टम के रूप में अनुमान लगाने के लिए मजबूर करेगा। टाइप करें। मुझे नहीं लगता कि रनटाइम मूल्यांकन प्रकार –

+0

@AZ, नहीं, गुजरने के ओपी इरादे को सही ढंग से प्रतिबिंबित करेगा। 'टाइप टी = test2.GetType()' भाग पूरी तरह से अनदेखा करें, इसकी आवश्यकता नहीं है। 'test2' 'ITest' लागू करता है (उसका पिछला प्रश्न देखें)। 'Test2' पास करना, यहां पर्याप्त है। –

+0

पर्याप्त मेला। दूसरे प्रश्न की जांच नहीं की गई, इसलिए मुझे test2 के संदर्भ की कमी थी। मैं अभी भी अपनी धारणा से खड़ा हूं कि ओपी किसी भी तरह रनटाइम पर गतिशील रूप से टी को हल करना चाहता है और यह नहीं है कि –

6

जेनरिक ऑफर संकलन समय पैरामीट्रिक पॉलिमॉर्फिज्म। आप उन्हें केवल रनटाइम पर निर्दिष्ट प्रकार के साथ उपयोग करने का प्रयास कर रहे हैं। संक्षिप्त उत्तर: यह काम नहीं करेगा और इसका कोई कारण नहीं है (प्रतिबिंब को छोड़कर लेकिन यह एक अलग जानवर है)। , के रूप में अन्य प्रतिक्रियाओं द्वारा कहा गया

typeof(YourType).GetMethod("PrintGeneric2").MakeGenericMethod(t).Invoke(instance, new object[] { test2 }); 

हालांकि, जेनेरिक्स नहीं हो सकता है:

26

तुम सच में एक प्रकार नहीं संकलन समय पर जाना जाता पैरामीटर का उपयोग कर एक सामान्य विधि आह्वान करने के लिए चाहते हैं, आप की तरह कुछ लिख सकते हैं आपके मामले में सबसे अच्छा समाधान।

+0

यह एक बहुत अच्छा उदाहरण है कि जब आपके पास रनटाइम प्रकार होता है तो सामान्य विधि का आह्वान कैसे करें, लेकिन ओपी वास्तव में अपने उदाहरण में ऐसा करने की कोशिश नहीं कर रहा है। @ म्यू-रस का जवाब सही ढंग से ओपी के सवाल को हल करता है। फिर भी, +1 क्योंकि मैं इस जवाब पर कई बार आया हूं जब मुझे इसे "जेनेरिक पैरामीटर के रूप में रनटाइम प्रकार" परिदृश्य के लिए जरूरी था। ;) – JMD

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