2016-04-06 14 views
1

Ich verwende Microsoft Office PIA von FSharp. Wenn ich versuche, und die SynonymInfo von Microsoft Word wie diese:FSharp und Microsoft Office PIA

#r "Office.dll" 
#r "Microsoft.Office.Interop.Word.dll" 
open Microsoft.Office.Interop.Word 

let application = ApplicationClass() 
let synonymInfo = application.SynonymInfo("bracket") 
let meaningList = synonymInfo.MeaningList :?> string[] 

ich diese Ausnahme bin immer:

System.InvalidCastException: Kann nicht Objekt des Typs werfen ‚System.String [*] 'Geben Sie' System.String [] 'ein.

Wird das Casting vom COM-Objekt verursacht? Wie kann ich das richtig umsetzen? Ist das * für ein Tupel? Wenn ja string [,] auch nicht funktioniert ...

Dank

Antwort

5

Das Office Interop gibt ein Array, wenn der Index nicht von 0 startet aber (wahrscheinlich) von 1 (guten alten Visual Basic mal!) Dies ist, was die * in der Art String[*] bedeutet.

Sie können sogar solche Arrays von F # erstellen:

let array = System.Array.CreateInstance(typeof<int>, [| 10 |], [| 1 |]) 

Leider ist Int32[*] eine andere Art als Int32[] und so das Casting versagt:

// System.InvalidCastException: Unable to cast 
// object of type 'System.Int32[*]' to type 'System.Int32[]'. 
array :?> int[] 

Sie werden die Daten konvertieren müssen in der 1-indizierten Array zu einer anderen Struktur auf andere Weise. Die Art der array in meinem Beispiel implementiert nicht-generic IEnumerable, so sollten Sie in der Lage sein, etwas zu schreiben wie:

array |> Seq.cast<int> |> Array.ofSeq 

Wenn der Typ des Wertes in Ihrem Fall obj ist, werden Sie sie werfen müssen, um die Schnittstelle zuerst:

[| for i in array.GetLowerBound(0) .. array.GetUpperBound(0) -> 
    i, array.GetValue(i) :?> int |] 
:

(thing :?> IEnumerable) |> Seq.cast<string> |> Array.ofSeq 

Sie auch ein Array mit Index-Wert-Paare mit so etwas wie dieses nicht erhalten

Verwandte Themen