Array
(
)

Dá p/ atribuir o valor default de uma propriedade c/ um atributo?

Lincoln Viana
   - 11 jan 2016

Eu quero fazer algo do tipo:
[DefaultValue(100)]
public int Max { get; set; }
//E no momento de utilizá-la, já iniciar em 100. Só que não atribui o valor e quando tento usar:

public void Teste()
{
int max = Max;
}
// O valor vem zerado.
// È possível fazer da forma que exemplifiquei ? Como?

Nilton Braz
   - 11 jan 2016

O atributo DefaultValue, por si só não altera o valor da propriedade. Ele serve para ser utilizado pelo editor de design e geradores de código.

É possível utilizar Reflection (note que reflection tem/pode ter um custo de performance, não é recomendado para substituir atribuições triviais) para iniciar as propriedades, o seguinte método de extensão obtêm todos as propriedades da classe e verifica pelo atributo DefaultValue, caso encontre ele obtêm o valor do atributo e atribui a propriedade.

public static class Extensoes
{
// método de extensão para `Object`, funcionando assim em
// todas classes
public static void InicializaValores(this Object o)
{
// obtem todas propriedades, campos...
var propriedades = o.GetType()
.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);

// para cada propriedade
foreach (var propriedade in propriedades)
{
// pega o atributo DefaultValue
var atributos = propriedade
.GetCustomAttributes(typeof(DefaultValueAttribute), true)
.OfType<DefaultValueAttribute>().ToArray();

// se encontrou
if (atributos != null && atributos.Length > 0)
{
// pega o atributo
var atributoValorPadrao = atributos[0];

// seta o valor da propriedade do objeto o
// para o valor do atributo
propriedade.SetValue(o, atributoValorPadrao.Value, null);
}
}
}
}
Com este método para ler o valor dos atributos e associar com a propriedade, ainda é necessário invocar o método.

Isto pode ser feito no construtor da classe, por exemplo:

public class Teste
{
[DefaultValue(10)]
public int Maximo { get; set; }

public int Minimo { get; set; }

public Teste()
{
this.InicializaValores();
}
}
Testando:

static class Program
{
static void Main(string[] a

0
|
0

Lincoln Viana
   - 12 jan 2016

OBRIGADO!

0
|
0

Joel Rodrigues
   - 12 fev 2016

Você não pode simplesmente atribuir um valor inicial à propriedade?
Em C# 6 podemos fazer:
#Código

public int Max {get; set; } = 100;

0
|
0

Rachel Andrade
   - 13 fev 2016

Estou usando C# 6 e essa forma de inicializar as propriedades é bem prática. Fiz um pequeno exemplo:

Clique na imagem para abrir em uma nova janela

0
|
0

Lincoln Viana
   - 16 mar 2016

Valeu galera!

0
|
0