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

11/01/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?

Lincoln Viana

Respostas

11/01/2016

Nilton Braz

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
Responder Citar

12/01/2016

Lincoln Viana

OBRIGADO!
Responder Citar

12/02/2016

Joel Rodrigues

Você não pode simplesmente atribuir um valor inicial à propriedade?
Em C# 6 podemos fazer:
public int Max {get; set; } = 100;
Responder Citar

13/02/2016

Rachel Andrade

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

[img]http://arquivo.devmedia.com.br/forum/imagem/303898-20160213-233400.png[/img]
Responder Citar

16/03/2016

Lincoln Viana

Valeu galera!
Responder Citar