web-dev-qa-db-fra.com

Un argument d'attribut doit être une expression constante, ...- Créer un attribut de type array

Voici mon attribut personnalisé et une classe sur laquelle je l'utilise:

[MethodAttribute(new []{new MethodAttributeMembers(), new MethodAttributeMembers()})]
public class JN_Country
{

}

public class MethodAttribute : Attribute
{
    public MethodAttributeMembers[] MethodAttributeMembers { get; set; }

    public MethodAttribute(MethodAttributeMembers[] methodAttributeMemberses)
    {
        MethodAttributeMembers = methodAttributeMemberses;
    }
}

public class MethodAttributeMembers
{
    public string MethodName { get; set; }
    public string Method { get; set; }
    public string MethodTitle { get; set; }
}

L'erreur de syntaxe, affichée sur la première ligne ci-dessus:

Un argument d'attribut doit être une expression constante, une expression typeof ou une expression de création de tableau d'un type de paramètre d'attribut

Pourquoi cette erreur se produit?

33
Football-Is-My-Life

Cela complète les informations que Simon a déjà données.

J'ai trouvé de la documentation ici: Tutoriel sur les attributs . (Il est indiqué que Visual Studio .NET 2003 se trouve en haut de la page, mais cela s'applique toujours.)

Les paramètres d'attribut sont limités aux valeurs constantes des types suivants:

  • Types simples (bool, octet, char, short, int, long, float et double)
  • chaîne
  • Type de système
  • enums
  • object (l'argument d'un paramètre d'attribut de type object doit être une valeur constante de l'un des types ci-dessus.)
  • Tableaux unidimensionnels de l'un des types ci-dessus (caractères gras ajoutés par moi)

La dernière puce explique votre erreur de syntaxe. Vous avez défini un tableau unidimensionnel, mais il ne devrait s'agir que de types primitifs, de chaînes, etc., comme indiqué dans les points précédents.

29
Grant

Les arguments d'attribut doivent être constants au moment de la compilation. Cela signifie que le compilateur doit pouvoir "incorporer" les valeurs des arguments lors de la compilation de Assembly. new ReferenceType() n'est pas constant - il doit être évalué au moment de l'exécution pour déterminer ce que c'est.

Fait intéressant, c'est un peu fragile dans la mesure où il existe des cas Edge à cette règle. Hormis ceux-là, vous ne pouvez pas faire ce que vous essayez de faire.

21
Simon Whitehead

Ajoutons que le compilateur peut renvoyer cette erreur sans fichier ni ligne de code particulier, si votre attribut a un constructeur qui a un paramètre qui n’est pas un type simple et que vous utilisez le constructeur (c’est-à-dire que votre paramètre non simple a un valeur par défaut).

[MyAttribute(MySimpleParameter: "Foo")]
public class MyObject
{

}

public class MyAttribute : Attribute
{
    public string MySimpleProperty { get; set; }

    public MyPropertyClass MyComplexProperty { get; set; }

    public MethodAttribute(string MySimpleParameter, MyPropertyClass MyComplexParameter = null)
    {
        MySimpleProperty = MySimpleParameter;
        MyComplexProperty = MyComplexParameter;
    }
}

public class MyPropertyClass
{
    public string Name { get; set; }
    public string Method { get; set; }
}
0
jahu