2009-03-10 9 views
42

मैं निम्नलिखित डालीCast एक ऐसी सूची <object> या IEnumerable <object>

private void MyMethod(object myObject) 
{ 
    if(myObject is IEnumerable) 
    { 
     List<object> collection = (List<object>)myObject; 
     ... do something 
    } 
    else 
    { 
     ... do something 
    } 
} 

प्रदर्शन करने के लिए कोशिश कर रहा हूँ लेकिन मैं हमेशा निम्नलिखित excepction के साथ समाप्त करने के लिए वस्तु प्राप्त System.Collections.Generic.List 1[MySpecificType]' to type 'System.Collections.Generic.List 1 [System.Object] '

मुझे वास्तव में काम करने की आवश्यकता है क्योंकि इस विधि को एकल ऑब्जेक्ट्स और संग्रह दोनों अनिर्दिष्ट प्रकार प्राप्त करने के लिए बहुत सामान्य होना आवश्यक है।

क्या यह संभव है, या इसे पूरा करने का एक और तरीका है।

धन्यवाद।

उत्तर

50

सी # 4 covariant और contravariant टेम्प्लेट पैरामीटर होगा, लेकिन तब तक आप कुछ nongeneric की तरह क्या करना है

IList collection = (IList)myObject; 
+0

धन्यवाद। यह किया –

+1

@ सर्जीओ, आपको यह जांचना चाहिए कि अगर आप रनटाइम त्रुटियों के जोखिम से बचना चाहते हैं तो आपको कास्टिंग करने से पहले myObject IEIumerable की बजाय IList लागू करता है। कई अंतर्निर्मित संग्रह IENumerable लागू करते हैं लेकिन IList नहीं (उदाहरण के लिए, शब्दकोश <>, हैशसेट <>, हैशटेबल, कतार, ढेर आदि)। – LukeH

+0

@Luke: यदि यह एक सूची है (जो प्रश्न द्वारा निहित है), यह IList को लागू करेगा। – erikkallen

2

कैसे

के बारे में
List<object> collection = new List<object>((IEnumerable)myObject); 
46

आप एक सूची < टी > को एक IEnumerable < टी > डाली नहीं कर सकता।

लेकिन आप इस का उपयोग कर LINQ पूरा कर सकते हैं:

var result = ((IEnumerable)myObject).Cast<object>().ToList(); 
+0

यह भी काम करता है। धन्यवाद। –

+2

यह मूल को कास्ट करने के बजाए एक नई सूची भी बना रहा है। –

6

आप वास्तव में जरूरत है सादा IEnumerable से अधिक जानकारी आपको देता है? बस इसे उस पर डालें और इसके साथ foreach का उपयोग करें। मुझे प्रोटोकॉल बफर के कुछ बिट्स में बिल्कुल वही स्थिति का सामना करना पड़ता है, और मैंने पाया है कि IEnumerable (या IList) को सूची की तरह एक्सेस करने के लिए कास्टिंग) बहुत अच्छी तरह से काम करता है।

9

समस्या यह है कि, आप एक अमीर वस्तु को उजागर करने की कोशिश कर रहे हैं। आप बस एक नई सूची में आइटम जोड़ने की जरूरत है:

if (myObject is IEnumerable) 
{ 
    List<object> list = new List<object>(); 
    var enumerator = ((IEnumerable) myObject).GetEnumerator(); 
    while (enumerator.MoveNext()) 
    { 
     list.Add(enumerator.Current); 
    } 
} 
+0

यह काम करता है ?? –

0

इस कोड मेरे लिए काम किया

List<Object> collection = new List<Object>((IEnumerable<Object>)myObject); 
1

मज़ा में शामिल होने का है ...

private void TestBench() 
    { 
     // An object to test 
     string[] stringEnumerable = new string[] { "Easy", "as", "Pi" }; 

     ObjectListFromUnknown(stringEnumerable); 
    } 

    private void ObjectListFromUnknown(object o) 
    { 
     if (typeof(IEnumerable<object>).IsAssignableFrom(o.GetType())) 
     { 
      List<object> listO = ((IEnumerable<object>)o).ToList(); 
      // Test it 
      foreach (var v in listO) 
      { 
       Console.WriteLine(v); 
      } 
     } 
    } 
0

आप टाइप करने की आवश्यकता का उपयोग ऑपरेटर के रूप में करें।

private void MyMethod(object myObject) 
{ 
if(myObject is IEnumerable) 
{ 
    List<object> collection = myObject as(List<object>); 
    ... do something 
} 
else 
{ 
    ... do something 
} 
}  
संबंधित मुद्दे