Il mio metodo generico ha bisogno di serializzare l'oggetto passato ad esso, tuttavia, solo insistendo sul fatto che implementa ISerializable non sembra funzionare. Per esempio, ho una struct restituita da un servizio web (contrassegnato con SerializableAttribute) che serializza su xml bene, ma, come previsto, il compilatore C# si lamenta.Come posso aggiungere un vincolo di tipo per includere qualcosa serializzabile in un metodo generico?
C'è un modo per controllare se l'oggetto è serializzabile prima di tentare di serializzarlo o, meglio ancora, un modo di usare la parola chiave where
per verificare che l'oggetto sia adatto?
Ecco il mio metodo integrale:
public static void Push<T>(string url, T message)
where T : ISerializable
{
string xml = SerializeMessage(message);
// Send the message to Amazon SQS
SendMessageRequest sendReq = new SendMessageRequest { QueueUrl = url, MessageBody = xml };
AmazonSQSClient client = new AmazonSQSClient(S3User, S3Pass);
client.SendMessage(sendReq);
}
E SerializeMessage:
private static string SerializeMessage<T>(T message)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
using (StringWriter stringWriter = new StringWriter())
{
xmlSerializer.Serialize(stringWriter, message);
return stringWriter.ToString();
}
}
Se questo non è possibile, qual è il modo migliore per eseguire un controllo che un oggetto è serializzabile in fase di esecuzione?
Questa risposta è errata, in quanto darà dei falsi positivi. typeof (T) valuta System.Runtime.Type, che è ISerializable, quindi valuterà sempre true. Usa questo invece ... se (! Typeof (T) .IsSerializable &&! (Typeof (ISerializable) .IsAssignableFrom (typeof (T)))) –
Grazie - aggiornato per i posteri :) –
Downvote rimosso per la modifica del vecchio post –