Meine generische Methode muss das an sie übergebene Objekt serialisieren, beharrt aber nur darauf, dass es ISerializable implementiert scheint nicht zu funktionieren. Zum Beispiel habe ich eine Struktur von einem Web-Service zurückgegeben (mit SerializableAttribute markiert), die in XML seriell, aber, wie erwartet, beschwert sich der C# -Compiler.Wie kann ich eine Typbeschränkung hinzufügen, um etwas Serialisierbares in eine generische Methode einzufügen?
Gibt es eine Möglichkeit, das Objekt serialisierbar zu überprüfen, bevor Sie versuchen, es zu serialisieren, oder, noch besser, eine Möglichkeit, das Schlüsselwort where
zu verwenden, um zu prüfen, ob das Objekt geeignet ist?
Hier ist meine volle Methode:
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);
}
Und 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();
}
}
Wenn dies nicht möglich ist, was ist der beste Weg, um eine Prüfung durchzuführen, dass ein Objekt zur Laufzeit serializable ist?
Diese Antwort ist falsch, da dies falsche positive Ergebnisse ergibt. typeof (T) wird zu System.Runtime.Type ausgewertet, was ISerializable ist, sodass es immer als wahr ausgewertet wird. Benutze das stattdessen ... if (! Typeof (T) .IsSerializable &&! (Typeof (ISerializable) .IsAssignableFrom (typeof (T)))) –
Danke - aktualisiert für die Nachwelt :) –
Downvote entfernt für die Bearbeitung der alten Post –