Per diletto sto affrontando lo sviluppo di qualche
applicativo WinForm (Igor, sto approcciando il tuo "mondo", quanto tu
inizierai a fare Web? ), e sono appena incorso in un problema che mi ha fatto
perdere parecchio tempo:
un mio UserControl ha una proprietà con tipo un mio oggetto della class
library.
Quando trascinavo il controllo nel form principale VisualStudio mi
apriva un bel messagebox con un errore dicendo che non riusciva a serializzare
la proprietà che fa riferimento all'oggetto in class library.
Dopo un po' di ricerca ho trovato l'attributo DesignerSerializationVisibility, che permette
di specificare come si deve comportare il designer quando autogenera il codice
per l'inizializzazione del controllo e di tutte le sue proprietà.
Riesce a gestire tutti i tipi base, ma quando incontra un oggetto che non
riconosce genera questo errore.
Quindi, se è necessario serializzare la proprietà a design time è necessario
realizzare un serializzatore custom usando CodeDom (e specificarlo usando l'attributo DesignerSerializer), ma se come nel mio caso
la proprietà viene impostata solo a runtime, si può indicare al designer di non
scrivere il codice di inizializzazione, usando l'attibuto DesignerSerializationVisibility e impostando
la visibilità a Hidden.
//SingleRowVariableEditor.cs
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Variable Variable
{
get { return _variable; }
set { _variable = value; Invalidate(); }
}
//VariableEditor.cs
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public List<Variable> VariableList
{
get
{
return _listVariables;
}
set { _listVariables = value; }
}
I possibili valori sono:
- Hidden :
indica che la proprietà non deve essere persistita nel codice di
inizializzazione
- Visible : indica che la proprietà deve
essere persistita nel codice di inizializzazione
- Content : indica che la proprietà deve
essere persistita inizializzando singolarmente tutte le proprietà pubbliche
dell'oggetto assegnato alla proprietà
Per maggiori dettagli sull'argomento vi indico queste pagine dell'MSDN:
Designer Serialization Overview: spiega i concetti
generali sulla serializzazione nel designer
DesignerSerializationVisibilityAttribute Class: la
spiegazione "ufficiale" dell'attributo in questione
DesignerSerializerAttribute Class: l'attributo per
specificare un proprio serializzatore
Dynamic Source Code
Generation and Compilation: Cos'è CodeDom?
CodeDomSerializer Class: la classe usata per scrivere
codice da programma
powered by IMHO 1.3
posted @ domenica 7 maggio 2006 15:58