2011-01-26 12 views
5

के साथ .NET 4.0 एक्सेल इंटरऑप समस्याएं Excel में आप XValues का उपयोग कर श्रृंखला ऑब्जेक्ट से एक गतिशील सरणी System.Object[*] वापस कर सकते हैं। .NET 3.5 में आप के लिए और सरणी यह ​​कास्टिंग द्वारा इस वस्तु में तत्वों का उपयोग कर सकते अर्थात्:गतिशील संग्रह

var values = (Array)series.XValues; 

.NET 4.0 में, यह काम नहीं करता है, और संदेश

"करने में असमर्थ 'System.Object []' टाइप करने के लिए 'System.Object [*]' प्रकार का कास्ट ऑब्जेक्ट "

दिया गया है।

कोई विचार? निम्नलिखित काम नहीं करता है:

  • इसे गतिशील के रूप में कास्टिंग।
  • इसे System.Object[*] पर कास्ट करना।
  • बस प्रत्येक लूप के लिए ऑब्जेक्ट को रखकर।
  • values[1] का उपयोग करके सीधे मूल्य तक पहुंचने का प्रयास कर रहा है, न तो गतिशील के रूप में डाला जाता है।

हालांकि सरणी के अंदर मान डीबगर में दिखाई देते हैं।

उत्तर

5

.NET, एक आयामी 'वेक्टर' और बहुआयामी सरणी में दो अलग-अलग प्रकार के सरणी हैं। आपको बाद की पीठ मिली है, एक रैंक के साथ एक बहुआयामी सरणी 1. यह तब होगा जब अप्रबंधित कोड ने एक सुरक्षितता वापस कर दी है जिसका निचला बाउंड 0

आप ऐरे के साथ सरणी की सामग्री को पढ़ सकते हैं। getValue()। या, यह परिवर्तित इस तरह:

private static object[] ConvertArray(Array arr) { 
     int lb = arr.GetLowerBound(0); 
     var ret = new object[arr.GetUpperBound(0) - lb + 1]; 
     for (int ix = 0; ix < ret.Length; ++ix) { 
      ret[ix] = arr.GetValue(ix + lb); 
     } 
     return ret; 
    } 

टेस्ट:

var native = Array.CreateInstance(typeof(object), new int[] { 42 }, new int[] { 1 }); 
    var dotnet = ConvertArray(native); 

नोट: यदि आप .NET 4.0 में एक समस्या है और ऊपर हो सकता है जब आप कुछ COM प्रकार पुस्तकालयों, कार्यालय विशेष रूप से। संपत्ति या विधि एक वेरिएंट लौटा सकती है जिसमें एक सरणी है। आपके सी # प्रोग्राम में गतिशील के रूप में समाप्त होता है। सी # कंपाइलर उस मामले में उचित बाइंडर कोड उत्पन्न नहीं करता है। पहले (ऑब्जेक्ट), फिर (ऐरे) को कास्ट करके उस पर काम करें।

+0

मुद्दा मैं किसी सरणी वस्तु जिसका कम ही सीमित नहीं है 0, मुद्दा मैं हो रही है के बाहर मूल्य नहीं मिल रहा है देखना क्या मैं COM ऑब्जेक्ट संग्रह को .NET द्वारा उपयोग करने योग्य किसी भी रूप में परिवर्तित करने में असमर्थ हूं। आपके द्वारा प्रदान किए गए उदाहरण कोड में ऐरे के ऑब्जेक्ट का उपयोग करना शामिल है, लेकिन मैं उस संग्रह को डालने में असमर्थ हूं जिसे मुझे ऐरे में दिया गया है। हालांकि आपके समय के लिए धन्यवाद। –

+0

'प्रकार की ऑब्जेक्ट डालने में असमर्थ' System.Object [*] '। यह एक सरणी है। –

+0

@ हंसपैसेंट उसमें कास्टिंग करने में कठिनाई है, विवरण के लिए मेरे उत्तर में लिंक देखें। – GreyCloud

7

उपरोक्त उत्तर उपयोगी है लेकिन ऐरे को कैसे डाला जाए इस मुद्दे को हल नहीं करता है।

4.0 से पहले नेट संस्करणों के तहत एक साधारण कलाकार काम करेगा।

सी # में

4.0 एक का उपयोग करना चाहिए

System.Array a = (System.Array)((object) returnedObject); // note order of brackets 

http://blogs.msdn.com/b/mshneer/archive/2010/06/01/oh-that-mysteriously-broken-visiblesliceritemslist.aspx

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