2009-10-01 6 views
2

Quelle est la meilleure façon de convertir un tableau JavaScript de doubleComment faire pour convertir un tableau JavaScript de doubles à un tableau .NET de doubles?

return [2.145, 1.111, 7.893]; 

dans un tableau .NET de double, lorsque le tableau Javascript est retourné d'un objet de contrôle WebBrowser document

object o = Document.InvokeScript("getMapPanelRegion"); 

sans utiliser cordes et analyse?

L'objet renvoyé est de type __ComObject car il s'agit d'un tableau renvoyé. Le tableau aura une taille fixe car je l'utilise pour renvoyer trois valeurs au code appelant. Ma solution actuelle est de retourner un | chaîne éliminée des trois valeurs, je divise et j'analyse la chaîne pour obtenir mes trois doubles. Si possible, je voudrais ne pas avoir à utiliser la manipulation de la chaîne car cela ressemble à un hack.

Répondre

1

De MSDN (HtmlDocument.InvokeScript Method):

Le type sous-jacent de l'objet retourné par InvokeScript variera. Si la fonction appelée Active Scripting renvoie des données scalaires, comme une chaîne ou un entier , il sera retourné comme une chaîne ...

Il semble que les entiers seront retournés sous forme de chaîne, vous pourriez supposer que la même chose s'applique aux doubles.

EDIT: J'ai oublié que vous parliez d'un tableau. Quoi qu'il en soit, MSDN continue:

... Si elle retourne un objet à base de script, comme un objet créé à l'aide nouvel opérateur de JScript ou VBScript, il sera de type objet ...

Il semble donc que vous obtiendrez un objet à la place, mais cela n'aide pas le fait que vous devrez le convertir dans votre code C#.

EDIT 2:

En ce qui concerne la conversion de la ComObject réelle. Après avoir lu this qui est sur Excel, mais il renvoie encore un ComObject, il semble que votre approche actuelle avec la chaîne semble la plus simple. Parfois, un hack est la meilleure solution: D

+1

Mais j'ai un tableau de doubles et ils sont traités différemment. – stevehipwell

+0

Désolé! J'ai remarqué. J'ai mis à jour ma réponse –

+0

Le problème est d'obtenir le __ComObject dans mon tableau .NET. – stevehipwell

0

Ce "problème" revient à transformer VARIANT en un tableau C#. Pour cela, le moyen le plus simple est d'utiliser la réflexion. Voici comment:

private static IEnumerable<object> SafeArrayToEnmrble (object comObject) 
{ 
    Type comObjectType = comObject.GetType(); 
    // spot here what is the type required 
    if (comObjectType != typeof(object[,])) 
    // return empty array, throw exception or whatever is your fancy 
     return new object[0]; 

    int count = (int)comObjectType.InvokeMember("Length", BindingFlags.GetProperty, null, comObject, null); 
    var result = new List<object>(count); 

    var indexArgs = new object[2]; 
    for (int i = 1; i <= count; i++) 
    { 
     indexArgs[0] = i; 
     indexArgs[1] = 1; 
     object valueAtIndex = comObjectType.InvokeMember("GetValue", BindingFlags.InvokeMethod, null, comObject, indexArgs); 
     result.Add(valueAtIndex); 
    } 

    return result; 
} 
Questions connexes