Dá p/ atribuir o valor default de uma propriedade c/ um atributo?
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?
[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
Curtidas 0
Respostas
Nilton Braz
11/01/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
É 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
GOSTEI 0
Lincoln Viana
11/01/2016
OBRIGADO!
GOSTEI 0
Joel Rodrigues
11/01/2016
Você não pode simplesmente atribuir um valor inicial à propriedade?
Em C# 6 podemos fazer:
Em C# 6 podemos fazer:
public int Max {get; set; } = 100;GOSTEI 0
Rachel Andrade
11/01/2016
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]
[img]http://arquivo.devmedia.com.br/forum/imagem/303898-20160213-233400.png[/img]
GOSTEI 0
Lincoln Viana
11/01/2016
Valeu galera!
GOSTEI 0