Copiar Array

02/08/2006 - 00:58 por Pablo Di Martino | Informe spam
Gente, hice la siguiente función para poder agregar un item a un array
ese item es una clase

public static void AgregarItemArray(ref Int_Web_Service_En.csSegmentos[]
aArray, Int_Web_Service_En.csSegmentos oObjeto)

{

Int_Web_Service_En.csSegmentos[] aArregloTemporal = null;

if (aArray == null)

aArregloTemporal = new Int_Web_Service_En.csSegmentos[1];

else

{

aArregloTemporal = new Int_Web_Service_En.csSegmentos[aArray.Length +1];

Array.Copy(aArray, aArregloTemporal, Math.Min(aArray.Length,
aArregloTemporal.Length));

}

aArregloTemporal[aArregloTemporal.Length -1] = oObjeto;

aArray = aArregloTemporal;

}



Ahora lo que quiero hacer es que esta función sea genérica (osea que agregue
un objeto cualquiera a un array cualquiera), probé declarando como Object
los dos parámetros pero a la hora de invocar a la funcion me dice que hay
error en los parámetros.



Como puedo solucionar este tema?

Gracias, Pablo

PD: Aclaro que no puedo utilizar un arraylist..

Preguntas similare

Leer las respuestas

#6 Octavio Hernandez
04/08/2006 - 11:30 | Informe spam
Pablo,

Perdona, con mi post anterior te desorienté. Efectivamente, como dice Guille
no es posible convertir ni siquiera de manera explícita un object[] en
csDescriError[] u otro tipo de array más "estrecho". Eso tiene toda la
lógica del mundo, puesto que el object[] podría potencialmente contener
cosas que no sean csDescriError

Cualquiera de las soluciones que te propone Guille es válida. Para mí la
solución genérica es muy superior, pero si usas C# anterior a 2.0 tendrás
que usar la otra...

Guille - Gracias, Maestro !!!

Salu2,

Octavio



"Pablo" escribió en el mensaje
news:
Octavio hice los cambios pertinente, compila pero a la hora de
ejecutar
tengo el siguiente error... "La conversión especificada no es válida"

Funcion (ejecuta perfecto)

public static object[] CopiarArray(object[] aArray, object oObjeto)
{
object[] aArregloTemporal = null;

if (aArray == null)
aArregloTemporal = new object[1];
else
{
aArregloTemporal = new object[aArray.Length +1];
Array.Copy(aArray, aArregloTemporal, Math.Min(aArray.Length,
aArregloTemporal.Length));
}

aArregloTemporal[aArregloTemporal.Length -1] = oObjeto;

return aArregloTemporal;
}


Llamado a la función
csDescriError[] oListaErrores;
csDescriError oDescriError = new csDescriError();

oDescriError.Descripcion = e.Message;
oDescriError.TipoError = csDescriError.eTipoError.eTipoError_NoControlado;

oListaErrores = (csDescriError[]) CopiarArray((object[])oListaErrores,
(object)oDescriError);


El error se produce cuando quiere asignar el resultado de CopiarArray a
oListaErrores.


Muchas gracias por tu ayuda, Pablo


"Octavio Hernandez" escribió:

Pablo,

Creo que el error no está en la función ni en la llamada en sí, sino en
que
intentas asignar el object[] resultante a un array
con elementos más específicos. Haz una conversión explícita:

csDescriError[] resultado = (csDescriError[]) CopiarArray(origen,
obj);

En cualquier caso, el método genérico es más elegante y 100% type-safe...

Slds - Octavio



"Pablo" escribió en el mensaje
news:
> La función la he definido de la siguiente manera
>
> public static object[] CopiarArray(object[] array, object objeto)
> {
> return array;
> }
>
> Pero cuando llamo a la función pasándole el arreglo de mis clases no
> compila
> diciendo Cannot implicitly convert type 'object[]' to
> 'Telesoft.Comafi.Int_Web_Service_En.csDescriError[]'
>
>
> "Octavio Hernandez" escribió:
>
>> Pablo,
>>
>> >> Ahora lo que quiero hacer es que esta función sea genérica...
>>
>> Pues eso, crea un método genérico ;-)
>> Este recibe un array y un objeto, y devuelve un nuevo array con el
>> nuevo
>> objeto agregado al final:
>>
>> public T[] Añadir<T>(T[] a, T obj)
>>
>> {
>>
>> T[] nuevo = new T[a.Length + 1];
>>
>> Array.Copy(a, nuevo, a.Length);
>>
>> nuevo[a.Length] = obj;
>>
>> return nuevo;
>>
>> }
>>
>>
>>
>> Salu2 - Octavio
>>
>>
>>
>>
>>



Respuesta Responder a este mensaje
#7 Pablo Di Martino
05/08/2006 - 00:49 | Informe spam
Gracias Guille... lo estaré viendo la semana que viene ya que hoy es mi
cumpleaños, así que felicítenme!!!!!

La semana q viene posteo las novedades

Muchas gracias, Pablo

"Guillermo 'guille'" escribió en el mensaje
news:%
No podrás nunca hacer esa conversión, al menos salvo que uses el código
"generic" que te mostró Octavio, con lo que simplemente tendrías que hacer
esto:
oListaErrores = CopiarArray<csDescriError>(oListaErrores, oDescriError);

El problema del código que devuelve object[] es que "object" es el tipo
elemental y no puedes "ampliar" un tipo de object a cualquier otro, al
revés si, es decir, de csDescriError lo puedes "reducir", ya que Object es
el tipo elemental.
Lo más que puedes hacer es usar un array de tipo object y acceder a los
elementos haciendo un "cast" al tipo adecuado:

object[] copia = CopiarArray(oListaErrores, oDescriError);

int n = 0;

foreach( object o in copia )

{

csDescriError de = (csDescriError)o;

Console.WriteLine("{0}: {1}, {2}", n++, de.Descripcion, de.TipoError);

}


Nos vemos.
Guillermo
Microsoft VB MVP desde 1997
Mentor Asociado de Solid Quality Learning Iberoamericana

Te invito a mi sitio: http://www.elguille.info/
Resuelve tus dudas en: http://foros.elguille.info/

"Pablo" escribió en el mensaje
news:
Octavio hice los cambios pertinente, compila pero a la hora de
ejecutar
tengo el siguiente error... "La conversión especificada no es válida"

Funcion (ejecuta perfecto)

public static object[] CopiarArray(object[] aArray, object oObjeto)
{
object[] aArregloTemporal = null;

if (aArray == null)
aArregloTemporal = new object[1];
else
{
aArregloTemporal = new object[aArray.Length +1];
Array.Copy(aArray, aArregloTemporal, Math.Min(aArray.Length,
aArregloTemporal.Length));
}

aArregloTemporal[aArregloTemporal.Length -1] = oObjeto;

return aArregloTemporal;
}


Llamado a la función
csDescriError[] oListaErrores;
csDescriError oDescriError = new csDescriError();

oDescriError.Descripcion = e.Message;
oDescriError.TipoError =
csDescriError.eTipoError.eTipoError_NoControlado;

oListaErrores = (csDescriError[]) CopiarArray((object[])oListaErrores,
(object)oDescriError);


El error se produce cuando quiere asignar el resultado de CopiarArray a
oListaErrores.


Muchas gracias por tu ayuda, Pablo


"Octavio Hernandez" escribió:

Pablo,

Creo que el error no está en la función ni en la llamada en sí, sino en
que
intentas asignar el object[] resultante a un array
con elementos más específicos. Haz una conversión explícita:

csDescriError[] resultado = (csDescriError[]) CopiarArray(origen,
obj);

En cualquier caso, el método genérico es más elegante y 100%
type-safe...

Slds - Octavio



"Pablo" escribió en el mensaje
news:
> La función la he definido de la siguiente manera
>
> public static object[] CopiarArray(object[] array, object objeto)
> {
> return array;
> }
>
> Pero cuando llamo a la función pasándole el arreglo de mis clases no
> compila
> diciendo Cannot implicitly convert type 'object[]' to
> 'Telesoft.Comafi.Int_Web_Service_En.csDescriError[]'
>
>
> "Octavio Hernandez" escribió:
>
>> Pablo,
>>
>> >> Ahora lo que quiero hacer es que esta función sea genérica...
>>
>> Pues eso, crea un método genérico ;-)
>> Este recibe un array y un objeto, y devuelve un nuevo array con el
>> nuevo
>> objeto agregado al final:
>>
>> public T[] Añadir<T>(T[] a, T obj)
>>
>> {
>>
>> T[] nuevo = new T[a.Length + 1];
>>
>> Array.Copy(a, nuevo, a.Length);
>>
>> nuevo[a.Length] = obj;
>>
>> return nuevo;
>>
>> }
>>
>>
>>
>> Salu2 - Octavio
>>
>>
>>
>>
>>









Respuesta Responder a este mensaje
#8 Guillermo guille
05/08/2006 - 23:23 | Informe spam
¡Que lo disfrutes!

Y no te empaches de tarta... je, je, je, je

Nos vemos.
Guillermo
Microsoft VB MVP desde 1997
Mentor Asociado de Solid Quality Learning Iberoamericana

Te invito a mi sitio: http://www.elguille.info/
Resuelve tus dudas en: http://foros.elguille.info/

"Pablo Di Martino" escribió en el mensaje
news:
Gracias Guille... lo estaré viendo la semana que viene ya que hoy es
mi cumpleaños, así que felicítenme!!!!!

La semana q viene posteo las novedades

Muchas gracias, Pablo

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida