Domanda

Voglio creare una classe generica che accetta solo classi serializzabili, si può fare con il vincolo where?

Il concetto che sto cercando è questo:

public class MyClass<T> where T : //[is serializable/has the serializable attribute]
È stato utile?

Soluzione

No, temo di no. Le uniche cose che puoi fare con i vincoli sono:

  • dove T: class - T deve essere un tipo di riferimento
  • dove T: struct - T deve essere un tipo di valore non annullabile
  • dove T: SomeClass - T deve essere SomeClass o derivarne da esso
  • dove T: ISomeInterface - T deve essere ISomeInterface o implementarlo
  • dove T: new () - T deve avere un costruttore pubblico senza parametri

Sono possibili varie combinazioni, ma non tutte. Niente sugli attributi.

Altri suggerimenti

Quello che so; non puoi farlo. Hai pensato di aggiungere un metodo "Inizializza" o qualcosa di simile?

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");
}

Non ho testato questo codice, ma spero che tu ottenga il mio punto.

Non temere. Il meglio che puoi fare è un controllo di runtime su Type.IsSerializable .

Se stai cercando una classe serializzabile, penso che tu sia sfortunato. Se stai cercando oggetti che hai creato, potresti creare una classe di base che è serializzabile e che tutte le classi che vuoi supportare ne derivino.

So che questo è vecchio, ma sto usando un costruttore statico per verificare. È più tardi ma ti consente di lanciare un errore in fase di esecuzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top