2012-10-31 26 views
10

के माध्यम से इस [int अनुक्रमणिका] को कॉल करना मैं माइक्रोसॉफ्ट ऑफिस पर एक प्रतिबिंब-आधारित देर से बाध्य लाइब्रेरी को लागू करने का प्रयास करता हूं। गुण और offce COM ऑब्जेक्ट के तरीकों निम्नलिखित तरीके से कहा जाता है:प्रतिबिंब

Type type = Type.GetTypeFromProgID("Word.Application"); 
object comObject = Activator.CreateInstance(type); 
type.InvokeMember(<METHOD NAME>, <BINDING FLAGS>, null, comObject, new object[] { <PARAMS>}); 

InvokeMember ही संभव तरीका है क्योंकि Type.GetMethod/getProperty COM ऑब्जेक्ट के साथ अनुचित तरीके से काम करता है।

तरीके और गुण InvokeMember का उपयोग कर कहा जा सकता है लेकिन अब मैं निम्नलिखित समस्या को हल करने के लिए है:

कार्यालय-इंटरॉप आवरण में विधि:

Excel.Workbooks wb = excel.Workbooks; 
Excel.Workbook firstWb = wb[0]; 

क्रमशः

foreach(Excel.Workbook w in excel.Workbooks) 
    // doSmth. 

कैसे क्या मैं प्रतिबिंब के माध्यम से Excel.Workbooks के इस [int अनुक्रमणिका] ऑपरेटर को कॉल कर सकता हूं?

+0

http://stackoverflow.com/questions/6202523/is-listi-an-alias-for-list-get-itemi-in-c – Rover

उत्तर

6

मैंने आपके प्रश्न को गलत समझा होगा, लेकिन उम्मीद है कि इससे कुछ मदद मिलती है।

यह हो जाता है n:

typeof(Workbooks).GetMethod("get_Item").Invoke(excel.Workbooks, new object[] { n }); 

GetMethod हालांकि मेरे लिए spendidly काम करने के लिए लगता है, आप नेट का कौन सा संस्करण उपयोग कर रहे हैं: वें कार्यपुस्तिका आप किसी कार्यपुस्तिका है जब?

अन्यथा यह काम हो सकता है:

typeof(Workbooks).InvokeMember("Item", BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, excel.Workbooks, new object[] { n }); 

यह एक (गणना) भी अत्यधिक उपयोगी है:

typeof(Workbooks).InvokeMember("Count", BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, excel.Workbooks, null). 

कार्यपुस्तिका प्राप्त करने के लिए करता है, तो प्रकार एक्सेल प्रकार है:

type.InvokeMember("Workbooks", BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, excel.Workbooks, null) 
+0

आपका जवाब हल समस्या: मैंने "आइटम" सदस्य को बुलाया लेकिन मुझे "InvokeMethod" बाइंडिंगफ्लैग का उपयोग करना पड़ा। :-) –

0

"get_Item" का आह्वान करने का प्रयास करें।

यह बताता है कि अनुक्रमित गुणों को कैसे संकलित किया जाता है, सदस्यों को get_Item कहा जाता है।

0

मैं COM वस्तु गणना करके मेरी समस्या हल कर दिया है:

public Workbook this[int iIndex] 
{ 
get 
{ 
    int c = 0; 
    foreach (Workbook wb in this) 
    { 
    if (c == iIndex) 
    return wb; 
    c++; 
    } 
    return null; 
} 
} 

// ... 

// The Workbook object is a wrapper for the COM object Excel.Workbook 
IEnumerator<Workbook> IEnumerable<Workbook>.GetEnumerator() 
{ 
foreach (var obj in (IEnumerable)m_COMObject) 
    yield return obj == null ? null : new Workbook(obj, this); 
} 

मैं जानता हूँ कि यह एक अप्रिय समाधान है, लेकिन यह काम करता है। :-) आपकी मदद के लिए

धन्यवाद

+0

आपने अपनी समस्या हल की है लेकिन आपने अपने प्रश्न का सही उत्तर नहीं दिया है। जब कोई आपकी विशिष्ट समस्या की खोज करता है तो उसे यह प्रश्न मिल सकता है लेकिन उत्तर जो सही के रूप में चिह्नित किया गया वह वह नहीं है जिसे वह ढूंढ रहा है। कृपया अपने प्रश्न/उत्तर को दोबारा दोहराएं। –