Oppure

Loading
29/11/21 12:57
Carlo
Se alla riga 32 hai un errore è normale, cerchi di ritornare un oggetto quando invece hai dichiarato che la funzione deve ritornare un tipo generico T.

alla riga 32:

return (T)_ret;

Naturalmente ritornando un tipo generico, poi devi eseguire tutti i controlli del caso per estrarre il valore che ti interessa.

Personalmente cambierei la funzione in:

object SendGetPacket<T>(T t)

Visto che il tipo generico al ritorno non ti serve più, fai la tua scelta...

Se invece sei certo che restituisci sempre un PaketData, per evitare sempre gli stessi controlli e conversioni di tipo:


PacketData SendGetPacket<T>(T t)
{
  //PacketData è un Pacchetto strutturato generico
  //che non richiede particolari accortenze
  //Diversamente dagli altri, ha solo funzioni limitate
  //di Ricezione e riposta di 2 semplici argomenti
  //Argument1 e Argument2 che in seguito i valori
  //vengono convertiti in base al tipo di richiesta
  //Contenuto nell'header
     
        PacketData p = new PacketData();
     
        if (typeof(T) == typeof(CharPaket)) //Se T in argomento è di tipo CharPacket
        {
              object ot = t;
              if(((CharPaket)ot).hp <= 0) //se personaggio gli HP sono < = di 0
              {
                  //Invio richiesta di Morte al server
                  p.Command = (uint)PacketHeader.HeaderCommand.ACT_CHAR_DEATH;
                  p.Argument1 = ((CharPaket)ot).accountID.ToString(); //Id Account
                  p.Argument2 = ((CharPaket)ot).CharNum.ToString(); //Numero del personaggio nel database
              }
        }
        return p;   
}
Ultima modifica effettuata da Carlo 29/11/21 14:02
in programmazione tutto è permesso
29/11/21 14:01
Thejuster
perfetto. ottimo carlo grazie :k:
piccola svista che non avevo notato.

Non ho ottenuto quello che realmente volevo, ma penso possa andar bene.

quello che volevo realmente (Forse mi sbaglio a spiegare o ad intepretare il codice)

non era avere un risultato finale come questo:

p = new PacketData();
                    p.Command = (uint)Packet.HeaderCommand.ACT_GET_CHAR;
                    p.Argument1 = accountID.ToString(); //ID Account                  
                    p.Argument2 = t[0]; //ID del Chara

                    CharPaket c = (CharPaket)client.SendGetPacket<PacketData>(p);



Ma una funzione che determinava in modo automatico il tipo da restituire.
esempio

CharPaket c = (CharPaket)client.SendGetPacket<PacketData>(p); //Manuale

CharPaket c = client.SendGetPacket<PacketData>(p); //Auto


Non so se mi sono spiegato o sbaglio io a capire il reale comportanto di questa funzione.
Quello che voglio e ottenere un tipo di cui non viene forzato a diventare tale (T)ret;

Ma che viene ristituito direttamente come tipo dalla funzione.

Cerco di farti capire cosa intendo.

Se facciamo in questo modo:


string prova(int i )  { return i.ToString(); }


string risultato = prova(10);


Come vedi, so che prova mi restiurà un valore di tipo string. perche la funzione è di tipo string

Quello che vorrei fare è una sorta di

T prova(int i);


ed avere esempio


int t = prova(10);
string t = prova(10);
float t = prova(10);
bool t = prova(10);



Una sola funzione, ma che restituisce diversi tipi da quello normalmente passati come generici T
spero di essermi spiegato perchè faccio confusione anche da solo :rotfl:

Ultima modifica effettuata da Thejuster 29/11/21 14:02
mire.forumfree.it/ - Mire Engine
C# UI Designer
29/11/21 14:13
Carlo
Ti sei spiegato benissimo, dovrebbe essere proprio lo scopo dei tipi generici, ho solo basi teoriche sull'argomento, non ho mai applicato.

Sono incuriosito, ci guarderò. :rofl:
in programmazione tutto è permesso
01/12/21 8:41
Thejuster
Perfetto, con un pò di pratica ho trovato la soluzione.

Ecco la soluzione


//Chiedo al server di Restituirmi il tipo CharPaket, E di leggere invece l'argomento come PacketData.
CharPaket test = client.SendGetPacket<CharPaket, PacketData>(p);


public T SendGetPacket<T,I>(I strict)
        {
            PacketData p = new PacketData();
            CharPaket ch = new CharPaket();
            
            if(typeof(I) == typeof(PacketData))
            {
                object pdata = strict;
                if(((PacketData)pdata).Command == (uint)PacketHeader.HeaderCommand.ACT_LOGIN)
                {
                    //
                }

                if(((PacketData)pdata).Command == (uint)PacketHeader.HeaderCommand.ACT_GET_CHAR)
                {
                    ch = GetCharInfo(p);
                }
            }


            return (T)Convert.ChangeType(ch,typeof(T));
        }



Funziona alla perfezione :k:
mire.forumfree.it/ - Mire Engine
C# UI Designer