Mi método genérico necesita serializar el objeto que se le pasa, sin embargo, simplemente insistir en que implementa ISerializable no parece funcionar. Por ejemplo, tengo una estructura devuelta desde un servicio web (marcado con SerializableAttribute) que se serializa a xml bien, pero, como se esperaba, el compilador de C# se queja.¿Cómo puedo agregar una restricción de tipo para incluir cualquier elemento serializable en un método genérico?
¿Hay alguna manera de verificar que el objeto sea serializable antes de intentar serializarlo o, mejor aún, utilizar la palabra clave where
para verificar que el objeto sea adecuado?
Aquí es mi método completo:
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);
}
Y 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();
}
}
Si esto no es posible, ¿cuál es la mejor manera de realizar una comprobación de que un objeto es serializable en tiempo de ejecución?
Esta respuesta es incorrecta, ya que dará falsos positivos. typeof (T) evalúa a System.Runtime.Type, que es ISerializable, por lo que siempre se evaluará como verdadero. Use esto en su lugar ... if (! Typeof (T) .IsSerializable &&! (Typeof (ISerializable) .IsAssignableFrom (typeof (T)))) –
Gracias - se actualizó para la posteridad :) –
Se ha eliminado la edición anterior de la publicación –