Vous pouvez implémenter l'interface ISerializable et l'utiliser « où T: ISerializable » mais vous devez mettre en œuvre les méthodes ISerializable dans toutes les classes. Une vérification au moment de l'exécution peut rechercher le SerializableAttribute sur la classe, mais vous n'avez pas de vérification de temps de compilation. Vous pourriez envisager d'écrire votre propre interface qui a très peu à mettre en œuvre, peut-être juste une propriété et implémenter cette interface sur chacune de vos classes. Quelque chose comme ...
public interface ISerializableSet {
bool IsSerializable { get; }
}
Votre mise en œuvre pourrait utiliser la réflexion puis de faire une vérification de l'exécution, votre méthode Foo serait déclarée « où T: ISerializableSet » pour votre chèque de compilation.
Voici un exemple plus complet ...
public interface ISerializableSet
{
bool IsSerializable { get; }
}
[Serializable]
class SerializableClass : ISerializableSet
{
[NonSerialized]
private bool _runTimeCheck = true;
#region ISerializableSet Members
public bool IsSerializable
{
get {
if(!_runTimeCheck)
return true;
if(0 != (this.GetType().Attributes & System.Reflection.TypeAttributes.Serializable))
return true;
return false;
}
}
#endregion
}
public static class Bar2
{
public static int Foo<T>(T obj) where T : ISerializableSet
{
ISerializableSet sc = obj;
Console.WriteLine("{0}", sc.IsSerializable.ToString());
return 1;
}
}
Vous pouvez tester la propriété IsSerializable dans votre constructeur et lancer une exception d'exécution dans le cas où quelqu'un enlève [Serializable] inadvertantly. Si vous utilisez des tests unitaires, vous pouvez détecter les problèmes au moment du test.
Vous ne pouvez pas faire cela. –