Question

Auparavant, je suis tombé sur un problème en essayant de partager une définition de type entre mon ASMX webservice et ma page .aspx (webclient)

Confus sur C # Tableau d'objets et de type implicite conversion

Si je comprends bien les conseils, le « problème » que cela crée peut être résolu en copiant le tableau d'objets créés dans le client à un nouveau tableau d'objets tels que définis par la classe proxy ASMX.

Être un débutant en C # Je suis toujours aux prises avec cette tâche simple. Voici plusieurs parties de mon code (les autres fragments dans le post précédent restent inchangés):

... voici où je alimenter les « données de test » Je veux transmettre au service Web:

// create an array of MetaData objects
MetaData[] nvPairs = new MetaData[20];   // arbitrary length of 20 pairs

// create arbitrary MetaData objects in the array
nvPairs[0] = new MetaData("Grant Number", "2577-9912");
nvPairs[1] = new MetaData("OPEAnalyst", "Simpson");

... ici je tente une fonction de « copier » à partir du type « réel » défini dans mon espace de noms TRIMBrokerUtil (que je ne peux pas utiliser complètement à cause du proxy) à la version proxy de ce type:

protected TRIMBrokerASMXProxy.ASMXProxy.MetaData[] CopyMetaData(
    MetaData utilArray)
{
    TRIMBrokerASMXProxy.ASMXProxy.MetaData[] outArray = 
        new TRIMBrokerASMXProxy.ASMXProxy.MetaData[utilArray.Name.Length];
    int i;
    for (i = 0; i < utilArray.Name.Length; i++)
    {
        outArray[i].Name = utilArray.Name;
        outArray[i].Value = utilArray.Value;
    }
    return outArray;
}

... et voici où je tente d'appeler cette fonction (drapeaux du compilateur 2 erreurs sur cette ligne:

TRIMBrokerASMXProxy.ASMXProxy.MetaData[] kvData = 
    CopyMetaData(metaDataArray); 

Les deux erreurs de compilation en dessous du point à la même ligne:

1 Erreur Le procédé de correspondance de meilleure surcharge pour '_Default.CopyMetaData (TRIMBrokerUtil.MetaData)' a des arguments non valides

Erreur 2 Argument '1': ne peut pas convertir les 'TRIMBrokerUtil.MetaData []' à 'TRIMBrokerUtil.MetaData'

Suis-je ferme?

Était-ce utile?

La solution

Vous avez déclaré votre paramètre à être plutôt que MetaData MetaData[] - en d'autres termes, il est pas un tableau. Vous êtes alors en utilisant plutôt beaucoup utilArray.Name, mais on ne sait pas pourquoi.

Je suppose que vous voulez réellement:

protected TRIMBrokerASMXProxy.ASMXProxy.MetaData[]
    CopyMetaData(MetaData[] utilArray)
{
    TRIMBrokerASMXProxy.ASMXProxy.MetaData[] outArray = 
        new TRIMBrokerASMXProxy.ASMXProxy.MetaData[utilArray.Length];
    for (int i = 0; i < utilArray.Length; i++)
    {
        outArray[i] = new TRIMBrokerASMXProxy.ASMXProxy.MetaData();
        outArray[i].Name = utilArray[i].Name;
        outArray[i].Value = utilArray[i].Value;
    }
    return outArray;
}

Par ailleurs, vous pourriez envisager une directive pour rendre ce using plus facile à lire:

using ProxyMetaData = TRIMBrokerASMXProxy.ASMXProxy.MetaData;

...

protected ProxyMetaData[] CopyMetaData(MetaData[] utilArray)
{
    ProxyMetaData[] outArray = new ProxyMetaData[utilArray.Length];
    for (int i = 0; i < utilArray.Length; i++)
    {
        outArray[i] = new ProxyMetaData();
        outArray[i].Name = utilArray[i].Name;
        outArray[i].Value = utilArray[i].Value;
    }
    return outArray;
}

Une autre alternative est Array.ConvertAll:

ProxyMetaData[] output = Array.ConvertAll(input,
    metaData => new ProxyMetaData(metaData.Name, metaData.Value));

Si vous ne l'utilisez C # 3, vous pouvez utiliser une méthode anonyme pour cela. Si ne dispose pas ProxyMetaData un constructeur approprié et vous sont en utilisant C # 3, vous pouvez utiliser un initialiseur d'objet:

ProxyMetaData[] output = Array.ConvertAll(input,
    metaData => new ProxyMetaData { metaData.Name, metaData.Value });

Si vous êtes coincé avec C # 2 et aucun constructeur approprié, puis:

ProxyMetaData[] output = Array.ConvertAll(input, delegate(MetaData metaData)
{
    ProxyMetaData proxy = new ProxyMetaData();
    proxy.Name = metaData.Name;
    proxy.Value = metaData.Value;
});

pense qui est couvert toutes les bases:)

Autres conseils

Je voudrais simplement utiliser LINQ pour faire ceci:

TRIMBrokerASMXProxy.ASMXProxy.MetaData[] kvData =
    metaDataArray.Select(d => 
        new TRIMBrokerASMXProxy.ASMXProxy.MetaData(
            d.Name, d.Value)).ToArray();

En outre, si vous utilisez .NET 3.5, cela signifie que vous pouvez utiliser WCF aussi bien, qui est ce que vous devez utiliser pour générer le proxy. Vous seriez en mesure d'attribuer votre type de TRIMBrokerASMXProxy.ASMXProxy.MetaData avec l'attribut DataContract et les membres étant sérialisé avec l'attribut DataMember. Ensuite, vous seriez en mesure de définir votre contrat avec le type réel, et ne pas avoir à effectuer la conversion du tout.

Vous pouvez également utiliser Array.ConvertAll. Je sais que vous êtes relativement nouveau à ce alors laissez-moi tenter de vous expliquer. Il dispose de 2 paramètres génériques. Le premier étant le type de tableau, il veut convertir (permet de l'appeler I). Et le second le type que vous souhaitez convertir en (permet de l'appeler O). Il accepte un tableau de type I et retourne un tableau de type O. Le second paramètre est un délégué de convertisseur. L'application de la dénomination que nous avons sa signature va comme.

delegate O Converter(I input);

Le corps du délégué doit contenir le code nécessaire pour effectuer la conversion. Dans la fonction ConvertAll, les codes itérés thru chacune des valeurs de la matrice d'entrée et passe ensuite au délégué. La valeur renvoyée par le délégué est ensuite stocké dans un tableau de sortie. Le tableau de sortie est renvoyée à l'utilisateur une fois que toutes les valeurs sont converties.

using ProxyMetaData = TRIMBrokerASMXProxy.ASMXProxy.MetaData;

ProxyMetaData[] convertedArray = Array.ConvertAll<MetaData, ProxyMetaData>(utilArray, 
delegate(MetaData metaData)
{
    ProxyMetaData returnValue = new ProxyMetaData();
    returnValue.Name = metaData.Name;
    returnValue.Value = metaData.Value;
    return returnValue;
});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top