Pregunta

Previamente, me encontré con un problema tratando de compartir una definición de tipo entre mi ASMX webservice y a mi .página aspx (webclient)

Confundido en C# Matriz de objetos y conversión de tipos implícita

Como yo lo entiendo, el asesoramiento, el "problema" que crea esto puede ser resuelto mediante la copia de la matriz de los objetos creados en el cliente a un nuevo array de objetos definidos por el ASMX clase de proxy.

Siendo un novato en C# yo aún estoy luchando con esta simple tarea.Aquí hay más partes de mi código (los otros fragmentos en el post anterior permanecen sin cambios):

...aquí es donde puedo rellenar los "datos de prueba" quiero pasar al servicio 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");

...aquí os intento de una función de "copia" de lo "real" tipo definido en mi TRIMBrokerUtil espacio de nombres (que no los puedo usar por completo debido a que el proxy) para el proxy versión de ese 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;
}

...y entonces aquí es donde trato de llamar a esa función (parámetros del compilador 2 errores en esta línea:

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

Tanto de los errores de compilación siguiente punto de la misma línea:

Error 1 El mejor método sobrecargado de coincidencia para " _Default.CopyMetaData(TRIMBrokerUtil.Metadatos)' tiene algunos argumentos no válidos

Error 2 El Argumento De '1':no se puede convertir de 'TRIMBrokerUtil.Los metadatos[]' a 'TRIMBrokerUtil.Metadatos"

Estoy cerca ?

¿Fue útil?

Solución

Se ha declarado el parámetro a ser MetaData en lugar de MetaData[] - en otras palabras, no es una matriz. entonces usted está usando en lugar utilArray.Name mucho, pero no es claro por qué.

Sospecho que realmente desea:

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

Por cierto, es posible que desee considerar una directiva using para hacer esto más fácil de leer:

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

Otra alternativa es Array.ConvertAll:

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

Si usted no está usando C # 3 se puede utilizar un método anónimo para eso. Si ProxyMetaData no tiene un constructor apropiado y que son usando C # 3, puede utilizar un inicializador de objeto:

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

Si usted está atascado con C # 2 y ningún constructor apropiado, entonces:

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

piensan que ha cubierto todas las bases:)

Otros consejos

Me acaba de utilizar LINQ para hacer esto:

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

Además, si está utilizando .NET 3.5, que significa que puede utilizar WCF, así, que es lo que se debe utilizar para generar el proxy. Usted sería capaz de atribuir el tipo de TRIMBrokerASMXProxy.ASMXProxy.MetaData con el atributo DataContract y los miembros por entregas con el atributo DataMember. A continuación, sería capaz de definir su contrato con el tipo real, y no tener que realizar la conversión en absoluto.

También puede utilizar Array.ConvertAll. Sé que usted es relativamente nuevo en esto así que vamos a tratar de explicar. Tiene 2 parámetros genéricos. El primero es el tipo de la matriz se quiere convertir (le llaman I). Y la segunda, el tipo que desea convertir a (le llaman O). Se acepta una matriz de tipo I y devuelve una matriz de tipo O. El segundo parámetro es un delegado Converter. La aplicación de la nomenclatura tenemos su firma va así.

delegate O Converter(I input);

El cuerpo del delegado debe contener el código necesario para hacer la conversión. Dentro de la función ConvertAll, se repite el código thru cada uno de los valores en la matriz de entrada y pasa entonces al delegado. El valor devuelto por el delegado se almacena entonces en una matriz de salida. La matriz de salida se devuelve al usuario una vez que todos los valores se convierten.

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;
});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top