Em todos os projetos ASP.NET que estive envolvido em minha vida, quase nunca me deparei com implementações idênticas de propriedades de ASP.NET UserControls. E não estou me referindo a propriedades de complexidade avançada ou média, falo sobre o tipo mais básico de propriedade, aquelas utilizadas para persistir uma informação na ViewState.
Particularmente esta é uma questão que, embora não muito importante, sempre me deixou muito curioso, mas que, por estar envolvido em questões mais relevantes, nunca reservei um tempo para pesquisar a respeito e descobrir a melhor maneira de persistir e recuperar uma informação na ViewState do ASP.NET através de uma propriedade.
Depois de muito pesquisar pelo Google sem encontrar um padrão de implementação bem definido, resolvi abrir o .NET Reflector e investigar como a Microsoft implementou esta tarefa em seus WebControls.
Durante esta análise do código-fonte do .NET Framework, percebi que existe um certo padrão em todo o código-fonte, onde a Microsoft define propriedades de objetos seguindo o esquema abaixo:
Propriedades “System.String”:
[Bindable(true, BindingDirection.TwoWay),
PersistenceMode(PersistenceMode.EncodedInnerDefaultProperty),
Editor("System.ComponentModel.Design.MultilineStringEditor,System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor)),
Localizable(true),
WebCategory("Appearance"),
DefaultValue(""),
WebSysDescription("TextBox_Text")]
public virtual string Text
{
get
{
string str = (string) this.ViewState["Text"];
if (str != null)
{
return str;
}
return string.Empty;
}
set
{
this.ViewState["Text"] = value;
}
}
* Propriedade Text do objeto System.Web.UI.WebControls.TextBox.
Propriedades “System.Boolean”:
[DefaultValue(false),
Bindable(true,
BindingDirection.TwoWay),
Themeable(false),
WebSysDescription("CheckBox_Checked")]
public virtual bool Checked
{
get
{
object obj2 = this.ViewState["Checked"];
return ((obj2 != null) && ((bool) obj2));
}
set
{
this.ViewState["Checked"] = value;
}
}
* Propriedade Checked do objeto System.Web.UI.WebControls.CheckBox.
Propriedades “System.Int32”:
[WebSysDescription("TableCell_RowSpan"),
WebCategory("Layout"),
DefaultValue(0)]
public virtual int RowSpan
{
get
{
object obj2 = this.ViewState["RowSpan"];
if (obj2 != null)
{
return (int) obj2;
}
return 0;
}
set
{
if (value < 0)
{
throw new ArgumentOutOfRangeException("value");
}
this.ViewState["RowSpan"] = value;
}
}
* Propriedade RowSpan do objeto System.Web.UI.WebControls.TableCell.

Fala Thiagão, muito bom esse artigo.