CLR: .Net / Mono / Boo / Otros CLR > C#
Dictionary de clases?
U2_Caparzo:
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
gabio2:
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! :)
U2_Caparzo:
--- Cita de: gabio2 en Domingo 17 de Junio de 2012, 01:49 ---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! :)
--- Fin de la cita ---
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: ---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);
}
--- Fin del código ---
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 :)
U2_Caparzo:
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
gabio2:
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# --- public class clsArray { byte[] Paquete; public clsArray(int _entero) { Paquete = BitConverter.GetBytes(_entero); } public byte[] getPacket() { return Paquete; } } class PruebaDictionary { static void Main() { Dictionary<string, object> miDiccionario = new Dictionary<string, object>(); //Creamos el Diccionario. clsArray miClaseArray = new clsArray(1024); //Objeto de tipo clsArray miDiccionario.Add("clsArray", miClaseArray); //Agregamos mi objeto a mi diccionario. //Ahora probamos un ejemplo sencillo. foreach (KeyValuePair<string, object> kvp in miDiccionario) { if (kvp.Key.Contains("clsArray")) { // Aquí hago casting para convertir mi objeto en clsArray y lo convierto en cadena para imprimirlo en pantalla. foreach (byte _byte in ((clsArray)kvp.Value).getPacket()) { Console.WriteLine(_byte.ToString()); } } } Console.ReadLine(); } }
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! :)
Navegación
[#] Página Siguiente
Ir a la versión completa