• Jueves 2 de Mayo de 2024, 07:39

Autor Tema:  Dictionary de clases?  (Leído 3380 veces)

U2_Caparzo

  • Miembro activo
  • **
  • Mensajes: 45
  • Nacionalidad: cl
  • Super duper divertido xDD
    • Ver Perfil
Dictionary de clases?
« en: Sábado 16 de Junio de 2012, 03:30 »
0
Hola a todos, hace poco comenze a escribir un emulador para un juego online(apoyado de varias guias obviamente) y ahora tengo que enviar muchos paquetes, las estructuras para estos las tengo en clases (asi no tengo que escribir el paquete desde 0, sino que cambio algunos valores y lo envio), pero la verdad no quiero crear una clase nueva cada vez que envio un paquete, asi que deseo guardar las clases usadas en un Dictionary para volver a usarlas, pero la duda esta en como las almaceno?

la idea es que sea algo como

Dictionary<ushort, ClasesDeLosPaquetes> MisPaquetes.

como puedo guardar clases en el dictionary? habia pensado en objects, o usar interfaces y hacer los paquetes derivados de la inetrface, pero luego no podria convertir el object o interface a la clase del paquete que requiero. como lo podria hacer?

de antemano gracias
Lo dificil se hace... lo imposible se intenta
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.(Frase de Albert Einstein)

gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re:Dictionary de clases?
« Respuesta #1 en: Domingo 17 de Junio de 2012, 01:49 »
0
Cada vez que cargues tú aplicación cargaras tú Diccionario en memoria?.. no sé si entendí bien (lo más seguro es que no n.n ),  pero creo que lo mejor es que crees un proyecto independiente con tus clases y en el proyecto donde tienes tú aplicación agregues como referencia el proyecto donde se encuentren tus clases, así las llamas cuando las necesites y no se cargarán en la memoria de la PC donde se use la aplicación.

Bueno sólo era una opinión, ahora si deseas usar el Dictionary puedes leer aquí:

http://msdn.microsoft.com/es-es/library/xfhwa508%28v=VS.80%29.aspx

http://msdn.microsoft.com/es-es/library/xfhwa508.aspx


Saludos! :)
@gabio87

U2_Caparzo

  • Miembro activo
  • **
  • Mensajes: 45
  • Nacionalidad: cl
  • Super duper divertido xDD
    • Ver Perfil
Re:Dictionary de clases?
« Respuesta #2 en: Domingo 17 de Junio de 2012, 02:34 »
0
Cada vez que cargues tú aplicación cargaras tú Diccionario en memoria?.. no sé si entendí bien (lo más seguro es que no n.n ),  pero creo que lo mejor es que crees un proyecto independiente con tus clases y en el proyecto donde tienes tú aplicación agregues como referencia el proyecto donde se encuentren tus clases, así las llamas cuando las necesites y no se cargarán en la memoria de la PC donde se use la aplicación.

Bueno sólo era una opinión, ahora si deseas usar el Dictionary puedes leer aquí:

http://msdn.microsoft.com/es-es/library/xfhwa508%28v=VS.80%29.aspx

http://msdn.microsoft.com/es-es/library/xfhwa508.aspx


Saludos! :)

no se yo no te entendi o tu no me entendiste xD...
pero bueno, aqui va otra explicacion :)
este es un ejemplo de una estructura de un packet(paquetes, los arrays de bytes que se envian de servidor a cliente en el juego, les dire packets por costumbre xd)
Código: [Seleccionar]
class AuthorizationResponse : IPacket
    {
        byte[] Packet;
        public byte[] ToArray
        {
            get { return this.Packet; }
        }
        public AuthorizationResponse(ClientSocket Client)
        {
            Packet = new byte[32];
            ConquerPacket.WriteUInt16(32, 0, this.Packet);
            ConquerPacket.WriteUInt16(1055, 2, this.Packet);
            ConquerPacket.WriteUInt32(Client.ClientUID, 4, this.Packet);
            ConquerPacket.WriteUInt32(Client.AuthType, 8, this.Packet);
            ConquerPacket.WriteString(Constants.ServerIP, 12, this.Packet);
            ConquerPacket.WriteUInt16(Constants.GamePort, 28, this.Packet);

        }

este es el packet mas simple que tengo. pasa que otros involucran mas valores y se envian muy seguido (cada segundo o incluso menos en el caso del chat publico).
Entonces, cada vez que tengo que enviar ese packet, estaria creando una nueva clase, lo cual me imagino (no soy nadie muy experenciado, pero crear una cantidad muy alta de clases tan seguido suena mal xD) que no es muy bueno.
Fue entonces cuando se me ocurrio, que cada vez que el Servidor envie un packet al cliente, revise si esa clase existe en el Dictionary(estaria creando un Dictionary por cada cliente), si existe editar esa clase y enviarla, o sino crearla y agregarla al Dictionary.

pero mi problema esta en que como guardo esas clases en el Dictionary, tendria la ID del paquete como ushort como TKey, pero como TValue no sabria que poner, porque si pongo Object, o una Interface que tengo creada o lo que sea, no se como convertir eso a la clase del Packet.
por eso tengo

Dictionary <ushort, Value> MisPackets; //aqui esta el problema, como agrego clases distintas como Value, y luego obtener la Clase que quiera de ese Value.

espero haberme explicado mas :)
Lo dificil se hace... lo imposible se intenta
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.(Frase de Albert Einstein)

U2_Caparzo

  • Miembro activo
  • **
  • Mensajes: 45
  • Nacionalidad: cl
  • Super duper divertido xDD
    • Ver Perfil
Re:Dictionary de clases?
« Respuesta #3 en: Domingo 17 de Junio de 2012, 03:45 »
0
creo que tengo la solucion... usar "as"
AuthorizationResponse AR = MisPackets[ID] as AuthorizationResponse;
pero al parecer crea una nueva clase... no estoy del todo seguro
Lo dificil se hace... lo imposible se intenta
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.(Frase de Albert Einstein)

gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re:Dictionary de clases?
« Respuesta #4 en: Domingo 17 de Junio de 2012, 04:07 »
0
Puedes ponerlo como Object y hacerle un cast después, para convertirlo en el tipo de dato que tú quisieras, es decir:

Código: C#
  1.  public class clsArray
  2.     {
  3.         byte[] Paquete;
  4.        public clsArray(int _entero)
  5.         {
  6.             Paquete = BitConverter.GetBytes(_entero);
  7.         }
  8.         public byte[] getPacket()
  9.         {
  10.            return Paquete;
  11.         }
  12.     }
  13.  
  14.     class PruebaDictionary
  15.     {
  16.         static void Main()
  17.         {
  18.             Dictionary<string, object> miDiccionario = new Dictionary<string, object>(); //Creamos el Diccionario.
  19.             clsArray miClaseArray = new clsArray(1024); //Objeto de tipo clsArray
  20.             miDiccionario.Add("clsArray", miClaseArray); //Agregamos mi objeto a mi diccionario.
  21.  
  22.             //Ahora probamos un ejemplo sencillo.
  23.             foreach (KeyValuePair<string, object> kvp in miDiccionario)
  24.             {
  25.                 if (kvp.Key.Contains("clsArray"))
  26.                 {
  27.                      // Aquí hago casting para convertir mi objeto en clsArray y lo convierto en cadena para imprimirlo en pantalla.
  28.                     foreach (byte _byte in ((clsArray)kvp.Value).getPacket())
  29.                     {
  30.                         Console.WriteLine(_byte.ToString());
  31.                     }
  32.                 }
  33.             }
  34.            Console.ReadLine();
  35.         }
  36.     }
  37.  

Realizé este pequeño ejemplo.. espero te sirva, aunque no sé si sea lo que pides, aunque para mi.. sigue siendo mejor la opción de generar un proyecto aparte donde crearias todas tus clases y luego sólo lo agregas como referencia a tú proyecto de la aplicación.. pero pues..  tampoco sé como tienes planeada tú aplicación.. bueno en fin.. espero sea de ayuda.., saludos! :)
@gabio87

U2_Caparzo

  • Miembro activo
  • **
  • Mensajes: 45
  • Nacionalidad: cl
  • Super duper divertido xDD
    • Ver Perfil
Re:Dictionary de clases?
« Respuesta #5 en: Domingo 17 de Junio de 2012, 04:37 »
0
Puedes ponerlo como Object y hacerle un cast después, para convertirlo en el tipo de dato que tú quisieras, es decir:

Código: C#
  1.  public class clsArray
  2.     {
  3.         byte[] Paquete;
  4.        public clsArray(int _entero)
  5.         {
  6.             Paquete = BitConverter.GetBytes(_entero);
  7.         }
  8.         public byte[] getPacket()
  9.         {
  10.            return Paquete;
  11.         }
  12.     }
  13.  
  14.     class PruebaDictionary
  15.     {
  16.         static void Main()
  17.         {
  18.             Dictionary<string, object> miDiccionario = new Dictionary<string, object>(); //Creamos el Diccionario.
  19.             clsArray miClaseArray = new clsArray(1024); //Objeto de tipo clsArray
  20.             miDiccionario.Add("clsArray", miClaseArray); //Agregamos mi objeto a mi diccionario.
  21.  
  22.             //Ahora probamos un ejemplo sencillo.
  23.             foreach (KeyValuePair<string, object> kvp in miDiccionario)
  24.             {
  25.                 if (kvp.Key.Contains("clsArray"))
  26.                 {
  27.                      // Aquí hago casting para convertir mi objeto en clsArray y lo convierto en cadena para imprimirlo en pantalla.
  28.                     foreach (byte _byte in ((clsArray)kvp.Value).getPacket())
  29.                     {
  30.                         Console.WriteLine(_byte.ToString());
  31.                     }
  32.                 }
  33.             }
  34.            Console.ReadLine();
  35.         }
  36.     }
  37.  

Realizé este pequeño ejemplo.. espero te sirva, aunque no sé si sea lo que pides, aunque para mi.. sigue siendo mejor la opción de generar un proyecto aparte donde crearias todas tus clases y luego sólo lo agregas como referencia a tú proyecto de la aplicación.. pero pues..  tampoco sé como tienes planeada tú aplicación.. bueno en fin.. espero sea de ayuda.., saludos! :)


Muchas gracias por el ejemplo, pero no satisface completamente mi duda, mira hice esta solucion con el EscritorDePaquetes que estoy usando, y algo que se asemeja a lo que debo hacer con los paquetes(sin el envio obviamente)

http://www.multiupload.nl/CHDNPJMJ32
(viene con comentarios lo mas importante solamente)

muchas gracias por tu interes en ayudar :)

viene con comentarios lo mas importante solamente
Lo dificil se hace... lo imposible se intenta
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.(Frase de Albert Einstein)

gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re:Dictionary de clases?
« Respuesta #6 en: Domingo 17 de Junio de 2012, 04:49 »
0
puede ser con el cast (que mencioné en el ejemplo que hice xD)  Paquete1 P1 = ((Paquete1)Paquetes[123]); .. o como tú también muy bien hiciste   Paquete1 P1 = Paquetes[123] as Paquete1;


@gabio87

gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re:Dictionary de clases?
« Respuesta #7 en: Domingo 17 de Junio de 2012, 04:50 »
0
Ya!!. es sábado por la noche.. y estamos programando?.. FOREVER ALONE! for  both of us!

jajajajjaa!!.. saludos!..
@gabio87

U2_Caparzo

  • Miembro activo
  • **
  • Mensajes: 45
  • Nacionalidad: cl
  • Super duper divertido xDD
    • Ver Perfil
Re:Dictionary de clases?
« Respuesta #8 en: Domingo 17 de Junio de 2012, 04:54 »
0
Ya!!. es sábado por la noche.. y estamos programando?.. FOREVER ALONE! for  both of us!

jajajajjaa!!.. saludos!..
jasjsajsjsaja buen punto u.u
Lo dificil se hace... lo imposible se intenta
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.(Frase de Albert Einstein)