2009-12-22 7 views
6

मुझे समस्या है कि ऑब्जेक्ट "oListType01" प्रकार के प्रकार < MyClass01> बनाने के बाद और इसे "ऑब्जेक्ट" प्रकार के अन्य ओबजेट "oObjectType" को असाइन करने के बाद मैं किसी और फ़ंक्शन "ElementAt (1)" तक नहीं पहुंच सकता। मैंने प्रतिबिंब का उपयोग करके कोशिश की लेकिन मुझे हमेशा "आमंत्रण" विधि में अपवाद (पैरामीटर संघर्ष) मिल रहा है। क्या कोई जानता है क्यों? मिलानप्रतिबिंब के साथ सूची <T> की विस्तार विधि "ElementAt" को कैसे कॉल करें?

MyClass01 oMy1 = new MyClass01(); 
oMy1._ID = "1"; 

MyClass01 oMy2 = new MyClass01(); 
oMy2._ID = "3"; 

IList<MyClass01> oListType01 = new List<MyClass01>(); 

oListType01.Add(oMy1); 
oListType01.Add(oMy2); 

object oObjectType = new object(); 

oObjectType = oListType01; 

यहाँ से fowrads (ऊपर की ओर वास्तविक मामले में अलग समारोह कॉल में होता है) केवल वस्तु oObjectType उपलब्ध है। वीएस oObjectType में दो तत्व दिखाता है जो मैं प्रति प्रतिबिंब तक पहुंचना चाहता हूं।

MethodInfo mInfo = typeof(System.Linq.Enumerable).GetMethod("ElementAt").MakeGenericMethod(typeof(object)); 
object oSingleObject = mInfo.Invoke(oObjectType, new object[] { 1 }); 
+0

आप इसे किसी ऑब्जेक्ट में पहली जगह क्यों निर्दिष्ट कर रहे हैं? यदि आपको किसी कारण से जाना है, और यदि आप संकलन-समय पर जानते हैं कि सूची में हमेशा MyClass01 उदाहरण शामिल होने जा रहे हैं, तो आप इसे वापस सूची पर क्यों नहीं डालते हैं, जैसे: ((सूची ) oObjectType) .lementAt (1); – tclem

+0

कृपया "उत्तर" पर एक नज़र डालें जहां मैंने समझाया कि आवेषण में केवल ओओब्जेक्ट टाइप के संदर्भ में उपयोग किया जा सकता है (oListType01 नहीं और MyClass01 नहीं)। – milan

उत्तर

9

मुझे लगता है कि आपके पास ऐसा करने का एक वैध कारण है लेकिन यह थोड़ा गलत लगता है। उस ने कहा कि यहां कुछ कोड है जो आप जो करने की कोशिश कर रहे हैं उसे पूरा करेंगे।

MethodInfo mInfo = typeof(System.Linq.Enumerable).GetMethod("ElementAt").MakeGenericMethod(typeof(MyClass01)); 
object oSingleObject = mInfo.Invoke(oObjectType, new object[] { oObjectType, 1 }); 

जब मैं इस कोड को चलाता हूं तो मुझे सूची में दूसरा तत्व मिलता है।

+0

कृपया "उत्तर" पर एक नज़र डालें जहां मैंने समझाया कि invoke में केवल oObjectType (oListType01 नहीं) के संदर्भ का उपयोग किया जा सकता है। – milan

+0

मैंने कोड बदल दिया ताकि यह संदर्भ पर आक्रमण कर सके। इससे हो जाना चाहिए। –

+0

यह मेरे लिए काम किया, धन्यवाद! बस एक नोट: mInfo.Invoke() के लिए पहला पैरामीटर शून्य हो सकता है। हम एक स्थिर विधि बुला रहे हैं, उदाहरण विधि पर कोई विधि नहीं। –

0

एलिमेंटएट एक्सटेंशन विधि शायद आईनेमेरेबल < टी > पर है और इसलिए जब आप किसी ऑब्जेक्ट की तरह अपनी सूची का इलाज करते हैं, तो एक्सटेंशन विधि तब तक उपलब्ध नहीं होगी जब तक आप इसे कास्ट नहीं करते। या तो ((सूची <MyClass01>) oObjectType) .lementAt() या (oObjectType सूची <MyClass01>) .ElementAt()।

मुझे पूछना है, हालांकि, सभी उचित सम्मान के साथ आप कभी भी ऐसा क्यों करना चाहते हैं? यह मुझे मारता है कि यहां कुछ गड़बड़ है जिसे इंटरफेस का उपयोग करके थोड़ा क्लीनर किया जा सकता है।

+0

'IENumerable' एक्सटेंशन विधियां' System.Linq.Enumerable' कक्षा पर हैं। System.Linq.Enumerable से –

+0

। । । सार्वजनिक स्थैतिक टीएसओएस तत्व (यह आईन्यूमेरेबल स्रोत, इंट इंडेक्स) {...} –

+0

कृपया ऊपर दिए गए उत्तर पर एक नज़र डालें जहां मैंने बाधाओं को समझाया। – milan

0

हम सुरक्षित रूप से है कि यह मान सकते हैं, तो:

  • oObjectType कुछ टी

की एक IEnumerable है फिर उसे यहां से आइटम निकालने के लिए कोड है।

ध्यान दें कि मैं गंभीरता से आश्चर्य है कि अगर यह सही इस बारे में जाने का रास्ता है, लेकिन आप हमें आप यह पता लगाने में मदद करने के वहाँ एक बेहतर तरीका है कि अगर पर्याप्त जानकारी नहीं दी है, इसलिए हम सभी के साथ छोड़ दिया रहे हैं पूछे गए सवाल का जवाब दे रहे हैं।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Reflection; 
using System.Diagnostics; 

namespace ConsoleApplication2 
{ 
    class MyClass01 
    { 
     public String _ID; 

     public override string ToString() 
     { 
      return _ID; 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      MyClass01 oMy1 = new MyClass01(); 
      oMy1._ID = "1"; 

      MyClass01 oMy2 = new MyClass01(); 
      oMy2._ID = "3"; 

      IList<MyClass01> oListType01 = new List<MyClass01>(); 

      oListType01.Add(oMy1); 
      oListType01.Add(oMy2); 

      object oObjectType = new object(); 

      oObjectType = oListType01; 

      Test(oObjectType); 

      Console.In.ReadLine(); 
     } 

     private static void Test(object oObjectType) 
     { 
      Type tObject = oObjectType.GetType(); 
      Debug.Assert(tObject.IsGenericType); 
      Debug.Assert(tObject.GetGenericArguments().Length == 1); 
      Type t = tObject.GetGenericArguments()[0]; 

      Type tIEnumerable = typeof(IEnumerable<>).MakeGenericType(t); 
      Debug.Assert(tIEnumerable.IsAssignableFrom(tObject)); 

      MethodInfo mElementAt = 
       typeof(Enumerable) 
       .GetMethod("ElementAt") 
       .MakeGenericMethod(t); 

      Console.Out.WriteLine("o[0] = " + 
       mElementAt.Invoke(null, new Object[] { oObjectType, 0 })); 
      Console.Out.WriteLine("o[1] = " + 
       mElementAt.Invoke(null, new Object[] { oObjectType, 1 })); 
     } 
    } 
} 
0

यह वास्तव में अपने other question के समान है, लेकिन इस मामले में, स्थिर ElementAt विधि वास्तव में दो मापदंडों की आवश्यकता होती है। इसे आज़माएं:

ऑब्जेक्ट oSingleObject = mInfo.Invoke (शून्य, नई वस्तु [] {oObjectType, 1});

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