55 votes

Comment passer des objets dans un constructeur d'attributs

Je suis d'essayer de transmettre des objets dans un des Attributs de constructeur comme suit:

[PropertyValidation(new NullOrEmptyValidatorScheme())]
public string Name { get; private set; }

Avec cet attribut constructeur:

 public PropertyValidationAttribute(IValidatorScheme validator) {
      this._ValidatorScheme = validator;
    }

Le code ne compile pas. Comment puis-je passer un objet dans un attribut comme ci-dessus?

EDIT: Oui NullOrEmptyValidatorScheme implémente IValidatorScheme.

Le message d'erreur: erreur CS0182: Un attribut argument doit être une expression constante, typeof de l'expression ou de la création de la matrice de l'expression d'un attribut de type de paramètre.

69voto

Marc Gravell Points 482669

Les valeurs dans les attributs sont limités à des types simples; par exemple, les constantes de base (y compris les chaînes) et typeof... vous ne pouvez pas utiliser new ou autre code plus complexe. En bref, vous ne pouvez pas faire cela. Vous pouvez lui donner le type de bien que:

[PropertyValidation(typeof(NullOrEmptyValidatorScheme)]

c'est à dire l' PropertyValidation ctor prend un Type, et l'utilisation Activator.CreateInstance à l'intérieur du code pour créer l'objet. Notez que vous devez idéalement juste magasin de la chaîne à l'interne (AssemblyQualifiedName).

Par l'ECMA 334v4:

§24.1.3 paramètre d'Attribut types

Les types de localisation et nommé paramètres pour un attribut de classe sont limité pour le paramètre d'attribut types, qui sont:

  • L'un des types suivants: bool, byte, char, double, float, int, long, short, string.
  • Le type object.
  • Le type System.Type.
  • Un type enum, c'est l'accessibilité du public et de la types dans lequel il est imbriqué (le cas échéant) ont également accessibles au public.
  • Unique dimensions des tableaux ci-dessus les types.

et

§24.2 spécification d'Attribut

...

Une expression E est un l'attribut de l'argument de l'expression si tous les les instructions suivantes sont remplies:

  • Le type d' E est un attribut type de paramètre (§24.1.3).
  • Au moment de la compilation, la valeur de E peut être résolu à l'une des opérations suivantes:
    • Une valeur constante.
    • Un typeof-expression (§14.5.11) la spécification d'un non-générique le type, un type construit fermé (§25.5.2), ou un indépendant de type générique (§25.5).
    • Un tableau à une dimension de l'attribut de l'argument-expressions.

10voto

Oleg Lvovitch Points 146

Comme les précédentes affiches noté, les types d'utilisation de l'attribut arguments sont assez sévèrement restreint (compréhensible, parce que leurs valeurs doivent être sérialisé directement dans l'assemblée des métadonnées blob).

Cela dit, vous pouvez probablement de créer une solution qui utilise typeofs, comme ceux qui peuvent être utilisés.

Par exemple :

[PropertyValidation(typeof(NullOrEmptyValidatorScheme))]
public string Name { get; private set; }

Cette syntaxe est parfaitement légal. Le code qui lit les attributs que vous devez obtenir le validateur de type, de créer une nouvelle instance du programme de validation (il peut même maintenir un cache de validateurs à la clé sur valicator types, le cas échéant - c'est assez technique), et puis l'appeler.

5voto

Eric Ouellet Points 1370

Aussi ... (je pense que c'est un bogue Microsoft)

Vous ne pouvez pas définir une valeur par défaut sur "null", mais les valeurs par défaut simples par défaut sont ok ("false", "7", "" Test ").

L'exemple suivant donne l'erreur suivante: 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.
dans le fichier: ... \ CSC

 public class SampleAttribute : Attribute
{
    private string _test;
    public SampleAttribute(string test = null)
    {
        _test = test;
    }
}

[Sample]
public class Toto
{

}
 

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