Domanda

In precedenza, mi sono imbattuto in un problema cercando di condividere una definizione di tipo tra il mio webservice ASMX e la mia pagina aspx (WebClient)

confuso su C # array di oggetti e di tipo implicita conversione

Per quanto ho capito il consiglio, il "problema" questo crea può essere risolto copiando l'array di oggetti creati nel client a un nuovo array di oggetti come definito dalla classe proxy ASMX.

Essendo un rookie in C # sto ancora lottando con questo semplice compito. Qui ci sono più parti del mio codice (gli altri frammenti nel post precedente rimangono invariati):

... qui è dove io popolo dei "dati di prova" Voglio passare al servizio 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");

... qui tento una funzione di "copiare" dal tipo "reale" definito nel mio namespace TRIMBrokerUtil (che non posso utilizzare completamente a causa del proxy) per la versione delega di questo tipo:

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;
}

... e poi qui è dove provo a chiamare quella funzione (flag di compilazione 2 errori su questa linea:

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

Entrambi gli errori di compilazione sotto il punto alla stessa riga:

di errore 1 Il metodo match migliore overload per '_Default.CopyMetaData (TRIMBrokerUtil.MetaData)' ha alcuni argomenti non validi

Errore 2 Argomento '1': non può convertire da 'TRIMBrokerUtil.MetaData []' a 'TRIMBrokerUtil.MetaData'

Sono chiudo?

È stato utile?

Soluzione

Hai dichiarato il vostro parametro di essere MetaData piuttosto che MetaData[] - in altre parole, non è un array. Si sta quindi utilizzando utilArray.Name un bel po ', ma non è chiaro il perché.

Ho il sospetto che si vuole realmente:

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;
}

A proposito, si potrebbe prendere in considerazione una direttiva using per rendere questo più facile da leggere:

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;
}

Un'altra alternativa è Array.ConvertAll:

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

Se non si utilizza C # 3 è possibile utilizzare un metodo anonimo per questo. Se ProxyMetaData non dispone di un costruttore appropriato e sono usando C # 3, è possibile utilizzare un inizializzatore di oggetto:

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

Se sei bloccato con C # 2 e nessun costruttore appropriato, quindi:

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

I pensare che è coperto tutte le basi:)

Altri suggerimenti

Vorrei solo usare LINQ per fare questo:

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

Inoltre, se si utilizza .NET 3.5, significa che è possibile utilizzare WCF pure, che è quello che si dovrebbe utilizzare per generare il proxy. Si sarebbe in grado di attribuire il tipo TRIMBrokerASMXProxy.ASMXProxy.MetaData con l'attributo DataContract ei membri di essere serializzato con l'attributo DataMember. Poi, si sarebbe in grado di definire il contratto con il tipo effettivo, e non è necessario eseguire la conversione a tutti.

È inoltre possibile utilizzare Array.ConvertAll. So che sei relativamente nuovo a questo modo vorrei provare a spiegare. Dispone di 2 parametri generici. Il primo è il tipo di matrice si vuole convertire (consente di chiamare I). E la seconda il tipo che si desidera convertire in (consente di chiamare O). Si accetta un array di tipo I e restituisce un array di tipo O. Il secondo parametro è un delegato Converter. Applicando la denominazione che abbiamo la sua firma va come.

delegate O Converter(I input);

Il corpo del delegato deve contenere il codice necessario per eseguire la conversione. All'interno della funzione ConvertAll, il codice un'iterazione del attraverso ognuno dei valori nella matrice di input e passa poi al delegato. Il valore restituito dal delegato viene quindi memorizzato in una matrice di uscita. L'array di uscita viene restituito all'utente una volta tutti i valori sono convertiti.

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;
});
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top