Dá p/ atribuir o valor default de uma propriedade c/ um atributo?
11/01/2016
0
[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
Posts
11/01/2016
Nilton Braz
É 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
12/02/2016
Joel Rodrigues
Em C# 6 podemos fazer:
public int Max {get; set; } = 100;
13/02/2016
Rachel Andrade
[img]http://arquivo.devmedia.com.br/forum/imagem/303898-20160213-233400.png[/img]
Clique aqui para fazer login e interagir na Comunidade :)