Puoi usare "dove" per richiedere un attributo in c #?
-
03-07-2019 - |
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]
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.