Question

Je veux créer une classe générique qui accepte uniquement les classes sérialisables. Peut-on le faire avec la contrainte where?

Le concept que je recherche est le suivant:

public class MyClass<T> where T : //[is serializable/has the serializable attribute]
Était-ce utile?

La solution

Non, j'ai bien peur que non. Les seules choses que vous puissiez faire avec des contraintes sont les suivantes:

  • où T: classe - T doit être un type de référence
  • où T: struct - T doit être un type de valeur non nullable
  • où T: SomeClass - T doit être SomeClass ou en dériver
  • où T: ISomeInterface - T doit être ISomeInterface ou l'implémenter
  • où T: new () - T doit avoir un constructeur public sans paramètre

Diverses combinaisons sont possibles, mais pas toutes. Rien sur les attributs.

Autres conseils

Ce que je sais tu ne peux pas faire ça. Avez-vous pensé à ajouter une méthode 'Initialize' ou quelque chose de similaire?

public void Initialize<T>(T obj)
{
     object[] attributes = obj.GetType().GetCustomAttributes(typeof(SerializableAttribute));
     if(attributes == null || attributes.Length == 0)
          throw new InvalidOperationException("The provided object is not serializable");
}

Je n'ai pas testé ce code, mais j'espère que vous comprenez ce que je veux dire.

N'ayez pas peur. Le mieux que vous puissiez faire est d’effectuer une vérification à l’exécution sur Type.IsSerializable .

Si vous recherchez une classe sérialisable, je pense que vous n’avez pas de chance. Si vous recherchez des objets que vous avez créés, vous pouvez créer une classe de base sérialisable et en dériver toutes les classes que vous souhaitez prendre en charge.

Je sais que c’est vieux, mais j’utilise un constructeur statique pour vérifier. Il est plus tard mais vous permet de générer une erreur lors de l'exécution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top