2010-04-19 17 views
2

J'ai un objet COM écrit dans Visual Fox Pro 9.0. Il a la procédure suivante:InvalidCastException Object [*] to Object []

PROCEDURE GetArray(m.vcArrayName as String) as array 
RETURN @&vcArrayName 

L'objet COM est référencé dans un projet VS2010 utilisant C#. La signature de la procédure en C# est:

object GetArray(string vcArrayName); 

Lors du débogage, je peux voir que la valeur retournée est {objet [1..1]} alors que le type est objet {objet []}. En développant la variable, je peux voir que c'est un tableau de base 1 avec un élément qui est une chaîne vide ("");

Toutefois, je ne peux pas convertir cette valeur en objet []. Je reçois toujours une exception InvalidCastException avec un message norvégien disant que je ne peux pas lancer Object [*] en Object [].

Une chose étrange est que si l'objet COM renvoie un tableau à deux dimensions, je n'ai aucun problème à le convertir en object [,]. Je trouve très étrange que deux dimensions soient plus faciles à gérer qu'une!

La question que je voudrais répondre est:

Quel est cet objet [*] affaires? Quelqu'un peut-il me dire si c'est une mauvaise traduction dans le message d'exception norvégien ou si Object [*] est une sorte de syntaxe C# obscure dont je n'ai pas entendu parler?

Répondre

5

vous obtenez un tableau multidimensionnel avec une dimension de 1 au lieu de un vecteur. Le langage C# ne vous permet pas de déclarer un tableau comme ça. Vous pouvez référencer la valeur de retour avec la classe Array, qui permet la conversion avec un code similaire à celui-ci:

public static object[] ConvertFoxArray(Array arr) { 
    if (arr.Rank != 1) throw new ArgumentException(); 
    object[] retval = new object[arr.GetLength(0)]; 
    for (int ix = arr.GetLowerBound(0); ix <= arr.GetUpperBound(0); ++ix) 
    retval[ix - arr.GetLowerBound(0)] = arr.GetValue(ix); 
    return retval; 
} 
4

object[] est un vecteur en termes CLI; ces doivent être à base 0 et à 1 dimension. object[*] est un tableau qui se trouve être à 1 dimension, et peut même (même si ce n'est pas le cas dans votre cas) être basé sur 0. Mais ce n'est pas un vecteur. Au lieu de diffuser, vous allez devoir copier les données dans un object[]. J'ai fait the same mistake here.

Vous devriez pouvoir utiliser CopyTo:

array.CopyTo(vector, 0); 

(où array est le object[*] et vector est le object[])