2013-04-24 31 views
16

मैं List<AnonymousObject> को List<dynamic> पर क्यों नहीं डाल सकता?डायनामिक ऑब्जेक्ट्स की सूची में अज्ञात प्रकार की कास्ट सूची

var datasource = someList.Select(o => new { x = o.A, y = o.B }); 
dgvSomeGridView.DataSource = datasource.ToList(); 
dgvSomeGridView.DataBind(); 

तो मैं निम्न कोड के साथ GridView.DataSource का उपयोग:: मैं इस निम्नलिखित कोड है

var ds = ((List<dynamic>)dgvSomeGridView.DataSource); 
.... 

लेकिन यह लाइन जहां मैं इसे List<dynamic> लिए डाली पर एक त्रुटि फेंकता है, यह कहते हैं:

System.Collections.Generic.List'1[<>f__AnonymousType0'8[System.Int32,System.String]] टाइप करने के लिए System.Collections.Generic.List'1[System.Object] टाइप करने में असमर्थ।

क्यों मैं एक dynamic के लिए अनाम प्रकार की एक सूची डाली नहीं कर सकते हैं, या के रूप में त्रुटि एक object प्रकार से कहता है? मैं इसे कैसे हल करूं?

मेरा कोड सी # में है, फ्रेमवर्क 4.0, वीएस -2010 प्रो में निर्मित, प्लेटफार्म एएसपी.नेट है।

कृपया मदद करें, अग्रिम धन्यवाद।

उत्तर

35

List<T> बाद में-संस्करण, नहीं सह-संस्करण है, तो आप करने के लिए IEnumerable<dynamic> में डाली जो सह संस्करण का समर्थन करता है है:

var ds = ((IEnumerable<dynamic>)dgvSomeGridView.DataSource).ToList(); 

अधिक information about covariant

+1

जोड़ने के लिए भूल नहीं है ' सिस्टम का उपयोग कर। लिंक्स; ' यदि आपके पास अभी तक –

6

सबसे पहले के लिए, सामान्य के साथ कास्टिंग उस तरह से काम नहीं करता है। यह कास्ट अमान्य है:

List<string> source = GetStrings(); 
List<object> source2 = (List<object>) source; 

कारण यह है कि सूची सह-भिन्न नहीं है। यदि यह था, तो आप source2.Add(source2); कर सकते थे और अचानक स्रोत 1 में स्वयं होता है जब इसमें केवल तार होना चाहिए।

दूसरा, Anonymous types केवल संकलक गुणों और मूल्य समानता अर्थशास्त्र के साथ कक्षाओं घोषित किया गया है। यदि आपने रीडोनली गुणों और मूल्य समानता अर्थशास्त्र के साथ एक वर्ग बनाया है, तो आपकी कक्षा एक अज्ञात प्रकार के समान होगी, सिवाय इसके कि आपके प्रकार में डेवलपर निर्धारित नाम होगा, जबकि अज्ञात प्रकार में एक कंपाइलर निर्धारित नाम होता है। Anon प्रकार विशेष नहीं हैं।

तीसरा, dynamic वेरिएबल कंपाइलर प्रकार की जांच के आसपास जाने का एक तरीका है। वे रनटाइम प्रकार की जांच के आसपास नहीं जाते हैं। आप प्रकार को गतिशील रूप से रूपांतरित करने के लिए सी # कास्टिंग सिंटैक्स का उपयोग कर सकते हैं ... नोट: यह एक कलाकार नहीं है! आप रनटाइम कास्ट किसी प्रकार से नहीं कर सकते जो रनटाइम पर मौजूद नहीं है।

हालांकि, ऑपरेशन जिसमें गतिशील प्रकार के अभिव्यक्तियां शामिल हैं, संकल्प द्वारा जांच या टाइप नहीं की जाती हैं। संकलक पैकेज ऑपरेशन के बारे में जानकारी एकत्र करते हैं, और उस जानकारी को बाद में रन टाइम पर ऑपरेशन का मूल्यांकन करने के लिए उपयोग किया जाता है। प्रक्रिया के हिस्से के रूप में, प्रकार गतिशीलता के चर प्रकार ऑब्जेक्ट के चर में संकलित किए जाते हैं। इसलिए, गतिशील समय केवल संकलन समय पर मौजूद है, रन समय पर नहीं।

static void convertToDynamic() 
{ 
    dynamic d; 
    int i = 20; 
    d = (dynamic)i; 
    Console.WriteLine(d); 

    string s = "Example string."; 
    d = (dynamic)s; 
    Console.WriteLine(d); 

    DateTime dt = DateTime.Today; 
    d = (dynamic)dt; 
    Console.WriteLine(d); 

} 
// Results: 
// 20 
// Example string. 
// 2/17/2009 9:12:00 AM 

अंत में, यदि आप अभी भी एक List<dynamic> चाहते हैं, ऐसा करते हैं:

var anonList = GetAnonList(); 
List<dynamic> dynamicList = anonList.Select(x => (dynamic)x).ToList(); 

लेकिन तुम बस के रूप में आसानी से कर सकता है:

var anonList = GetAnonList(); 
List<object> objectList = anonList.Cast<object>().ToList(); 
+0

ग्रेट नहीं है, तो आपके दस्तावेज़ हेडर में, यह मेरे लिए काम करता है! –

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