2 votes

C# Obtenir la valeur d'un champ par attribut (PropertyInfo)

J'ai les propriétés de classe suivantes :

[EffectAspect(Enums.Effects.Low)]
public int Wind { set; get; }

[EffectAspect(Enums.Effects.Low)]
public int Fire { set; get; }

[EffectAspect(Enums.Effects.Medium)]
public int Water  { get; set; }

[EffectAspect(Enums.Effects.Huge)]
public int Earth  { get; set; }`

Maintenant, disons que je veux calculer le total des basses, moyennes et hautes. Donc j'ai écrit quelque chose comme :

List<Enums.Effects> result = new List<Enums.Effects>();

PropertyInfo[] properties = GetType().GetProperties();
foreach (PropertyInfo p in properties)
{
    object[] attrs = p.GetCustomAttributes(true);
    foreach (Object attr in attrs)
    {
        var effectAttr = attr as EffectAspect;
        if (effectAttr != null)
        {
            int amount = (int)p.GetConstantValue();
            for (int i = 0; i < amount; i++)
            {
                result.Add(effectAttr.Aspect);
            }
        }
    }
}
return result;            

Par exemple : si Wind = 3 il y aurait au moins 3 Enums.Effects.Low à l'intérieur de la result liste.

[AttributeUsage(AttributeTargets.Property)]
public sealed class EffectAspectAttribute : Attribute
{
    public Enums.EffectsAspect { get; private set; }

    public EffectAspectAttribute (Enums.EffectsAspect aspect)
    {
        this.Aspect = aspect;
    }
}

Les problèmes sont : int amount = (int)p.GetConstantValue(); lance des exceptions dit :

La valeur littérale n'a pas été trouvée.

Et je n'ai pas trouvé ce que ça veut dire.

1voto

Rahul Tripathi Points 1

Vous pouvez essayer d'utiliser

p.GetValue(this, null)

au lieu de

p.GetConstantValue();

Vous pouvez vous référer à ce lien : Différence entre GetValue, GetConstantValue et GetRawConstantValue

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X