none
Utilisation d'une Template dans une structure

    Question

  • Bonjour,

     

    J'ai trouve de nombreuse source utile pour me permettre de mettre en place une Template, mais aucune qui fonctionne dans mon cas.

    J'explique le context :

    - Je recupere en UDP une commande avec un entete contenant le type de data qui suivront (par exemple l'entete sera : [size;4b][type;4b][version;1b][flag;1b] puis les donnees, si le type est "liste d'ID" [nbEntry;1b][id;Xb], ou de type commande [cmd;4b][value;Xb] ... b = bytes)

    - J'ai une structure "UDPRequest" qui contient l'entete et une variable de type Template puisqu'il depend du type du message

    - ma methode Listen (thread qui tourne pour l'ecoute UDP et remonte les events) doit retourner un UDPRequest. Mais la ca bloque. Je n'arrive pas a creer un UDPRequest sans avoir a definir la template.

    Pour etre plus clair, voila le code concerne:

    public struct Message
    {
    	int size; // 4 bytes
    	typeMessage type; // 4 bytes
    	byte version; // 1 bytes
    	ContentMessage<T> contentMessage;
    }
    
    public struct ID
    {
    	int nbEntry; // 4 bytes
    	List<int > ID = new List<int >(); // 4x bytes
    }
    
    public struct Cmd
    {
    	int ID; // 4 bytes
    	string cmd; // 12 bytes
    }
    
    public enum typeMessage
    {
    	ID_INFO,
    	CMD_CHANNEL,
    	...
    	ERROR
    }
    
    public Message receiveMessage()
    {
    	...
    	byte [] r = _client.Receive(ref ip);
    	...
    	string type = System.Text.Encoding.ASCII.GetString(r, 4, 4);
    	switch (type)
    	{
    		case 'IDIF' :
    			Message message = new Message();
    			// create message type ID_INFO, template struct ID
    			...
    			return message;
    		break ;
    		case 'CDCN' :
    			Message message = new Message();
    			// create message type CMD_CHANNEL, template struct Cmd
    			...
    			return message;
    			break ;
    	...
    	}
    }


    Bref, ca ne veux pas et je ne sais pas comment m'y manier cela ...

    Oh! et je suis en mode console avec le framework 4.

    si quelqu'un pu eclairer ma lanterne, je le remerci d'avance.

    Cordialement.

    PS: utilisant un clavier US, excusez l'absence d'accent, merci =)

    • Edited by Artamos Thursday, January 27, 2011 5:13 AM mise en page du code
    Thursday, January 27, 2011 5:04 AM

Answers

  • Bonjour,

    Dans ce cas, il faudrait mieux passer par de l'héritage :

    public class Message
    {
    
    }
    
    public class InfoMessage : Message
    {
    
    }
    
    public class CommandMessage : Message
    {
    
    }
    

    Et ensuite, vous retournez dans la méthode ReceiveMessage() un objet de type Message (et donc par polymorphisme tout ce qui hérite).

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    • Marked as answer by Artamos Thursday, January 27, 2011 8:57 AM
    Thursday, January 27, 2011 8:55 AM
    Moderator

All replies

  • Bonjour,

    Peut-on voir la structure de la classe ou structure "ContentMessage" qui est utilisé dans la structure Message ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    Thursday, January 27, 2011 5:33 AM
    Moderator
  • Oui bien sur, desole.

     

    public struct ContentMessage<T>
    {
    	T typeMessage;
    }
    

    Je sais que c'est faux, mais ne trouve pas comment resoudre.

    Thursday, January 27, 2011 6:32 AM
  • Bonjour,

    Dans ce cas il faut déclarer Message avec un type générique "T" :

    public struct Message<T>
    {
    	int size; // 4 bytes
    	typeMessage type; // 4 bytes
    	byte version; // 1 bytes
    	ContentMessage<T> contentMessage;
    }
    
    

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    Thursday, January 27, 2011 8:36 AM
    Moderator
  • Bonjour,

     

    merci pour la reponse. Mais ce n'est malheureusement pas ce qu'il me faut.

     

    car alors ma methode serais:

    public Message<T> receiveMessage()
    {
    	...
    }
    

    alors que je ne sais pas encore quel est le type de message lorsque j'appelerais receiveMessage()

    par exemple :

    Message messageUDP = obj.receiveMessage();
    
    switch(messageUDP.type)
    {
    	case typeMessage.ID_INFO:
    		ID listID = (ID)messageUDP.content;
    		...
    		break;
    	case typeMessage.CMD_CHANNEL:
    		Cmd command = (CMD)messageUDP.content;
    		...
    		break;
    	...
    }
    
    

    Cordialement.

    Thursday, January 27, 2011 8:51 AM
  • Bonjour,

    Dans ce cas, il faudrait mieux passer par de l'héritage :

    public class Message
    {
    
    }
    
    public class InfoMessage : Message
    {
    
    }
    
    public class CommandMessage : Message
    {
    
    }
    

    Et ensuite, vous retournez dans la méthode ReceiveMessage() un objet de type Message (et donc par polymorphisme tout ce qui hérite).

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    • Marked as answer by Artamos Thursday, January 27, 2011 8:57 AM
    Thursday, January 27, 2011 8:55 AM
    Moderator
  • et voila comment ce faire avoir, a vouloir se compliquer, sur des bases de premiere annee =)

     

    Merci beaucoup!

    Thursday, January 27, 2011 8:58 AM