Lire en anglais

Partager via


CustomAttributeNamedArgument Structure

Définition

Représente un argument nommé d’un attribut personnalisé dans le contexte de réflexion uniquement.

C#
public struct CustomAttributeNamedArgument
C#
public readonly struct CustomAttributeNamedArgument
C#
public readonly struct CustomAttributeNamedArgument : IEquatable<System.Reflection.CustomAttributeNamedArgument>
C#
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public struct CustomAttributeNamedArgument
Héritage
CustomAttributeNamedArgument
Attributs
Implémente

Exemples

L’exemple suivant définit un attribut personnalisé avec quatre constructeurs et quatre propriétés. Deux des propriétés sont en lecture seule et sont définies à l’aide des paramètres positionnels des constructeurs. Les deux autres propriétés sont en lecture/écriture et peuvent être définies uniquement à l’aide d’arguments nommés. Une propriété positionnelle est un tableau de chaînes, et une propriété nommée est un tableau d’entiers.

L’attribut est appliqué à l’assembly, à un type déclaré dans l’assembly, à une méthode du type et à un paramètre de la méthode. Différents constructeurs sont utilisés pour ces cas. Lorsqu’il est exécuté, l’assembly se charge dans le contexte de réflexion uniquement et affiche des informations sur les attributs personnalisés qui ont été appliqués à celui-ci et au type et aux membres qu’il contient.

L’attribut appliqué au type illustre les propriétés de tableau, avec des arguments positionnels et nommés.

C#
using System;
using System.Reflection;
using System.Collections.Generic;
using System.Collections.ObjectModel;

// The example attribute is applied to the assembly.
[assembly:Example(ExampleKind.ThirdKind, Note="This is a note on the assembly.")]

// An enumeration used by the ExampleAttribute class.
public enum ExampleKind
{
    FirstKind,
    SecondKind,
    ThirdKind,
    FourthKind
};

// An example attribute. The attribute can be applied to all
// targets, from assemblies to parameters.
//
[AttributeUsage(AttributeTargets.All)]
public class ExampleAttribute : Attribute
{
    // Data for properties.
    private ExampleKind kindValue;
    private string noteValue;
    private string[] arrayStrings;
    private int[] arrayNumbers;

    // Constructors. The parameterless constructor (.ctor) calls
    // the constructor that specifies ExampleKind and an array of
    // strings, and supplies the default values.
    //
    public ExampleAttribute(ExampleKind initKind, string[] initStrings)
    {
        kindValue = initKind;
        arrayStrings = initStrings;
    }
    public ExampleAttribute(ExampleKind initKind) : this(initKind, null) {}
    public ExampleAttribute() : this(ExampleKind.FirstKind, null) {}

    // Properties. The Note and Numbers properties must be read/write, so they
    // can be used as named parameters.
    //
    public ExampleKind Kind { get { return kindValue; }}
    public string[] Strings { get { return arrayStrings; }}
    public string Note
    {
        get { return noteValue; }
        set { noteValue = value; }
    }
    public int[] Numbers
    {
        get { return arrayNumbers; }
        set { arrayNumbers = value; }
    }
}

// The example attribute is applied to the test class.
//
[Example(ExampleKind.SecondKind,
         new string[] { "String array argument, line 1",
                        "String array argument, line 2",
                        "String array argument, line 3" },
         Note="This is a note on the class.",
         Numbers = new int[] { 53, 57, 59 })]
public class Test
{
    // The example attribute is applied to a method, using the
    // parameterless constructor and supplying a named argument.
    // The attribute is also applied to the method parameter.
    //
    [Example(Note="This is a note on a method.")]
    public void TestMethod([Example] object arg) { }

    // Main() gets objects representing the assembly, the test
    // type, the test method, and the method parameter. Custom
    // attribute data is displayed for each of these.
    //
    public static void Main()
    {
        Assembly asm = Assembly.ReflectionOnlyLoad("Source");
        Type t = asm.GetType("Test");
        MethodInfo m = t.GetMethod("TestMethod");
        ParameterInfo[] p = m.GetParameters();

        Console.WriteLine("\r\nAttributes for assembly: '{0}'", asm);
        ShowAttributeData(CustomAttributeData.GetCustomAttributes(asm));
        Console.WriteLine("\r\nAttributes for type: '{0}'", t);
        ShowAttributeData(CustomAttributeData.GetCustomAttributes(t));
        Console.WriteLine("\r\nAttributes for member: '{0}'", m);
        ShowAttributeData(CustomAttributeData.GetCustomAttributes(m));
        Console.WriteLine("\r\nAttributes for parameter: '{0}'", p);
        ShowAttributeData(CustomAttributeData.GetCustomAttributes(p[0]));
    }

    private static void ShowAttributeData(
        IList<CustomAttributeData> attributes)
    {
        foreach( CustomAttributeData cad in attributes )
        {
            Console.WriteLine("   {0}", cad);
            Console.WriteLine("      Constructor: '{0}'", cad.Constructor);

            Console.WriteLine("      Constructor arguments:");
            foreach( CustomAttributeTypedArgument cata
                in cad.ConstructorArguments )
            {
                ShowValueOrArray(cata);
            }

            Console.WriteLine("      Named arguments:");
            foreach( CustomAttributeNamedArgument cana
                in cad.NamedArguments )
            {
                Console.WriteLine("         MemberInfo: '{0}'",
                    cana.MemberInfo);
                ShowValueOrArray(cana.TypedValue);
            }
        }
    }

    private static void ShowValueOrArray(CustomAttributeTypedArgument cata)
    {
        if (cata.Value.GetType() == typeof(ReadOnlyCollection<CustomAttributeTypedArgument>))
        {
            Console.WriteLine("         Array of '{0}':", cata.ArgumentType);

            foreach (CustomAttributeTypedArgument cataElement in
                (ReadOnlyCollection<CustomAttributeTypedArgument>) cata.Value)
            {
                Console.WriteLine("             Type: '{0}'  Value: '{1}'",
                    cataElement.ArgumentType, cataElement.Value);
            }
        }
        else
        {
            Console.WriteLine("         Type: '{0}'  Value: '{1}'",
                cata.ArgumentType, cata.Value);
        }
    }
}

/* This code example produces output similar to the following:

Attributes for assembly: 'source, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
   [System.Runtime.CompilerServices.CompilationRelaxationsAttribute((Int32)8)]
      Constructor: 'Void .ctor(Int32)'
      Constructor arguments:
         Type: 'System.Int32'  Value: '8'
      Named arguments:
   [System.Runtime.CompilerServices.RuntimeCompatibilityAttribute(WrapNonExceptionThrows = True)]
      Constructor: 'Void .ctor()'
      Constructor arguments:
      Named arguments:
         MemberInfo: 'Boolean WrapNonExceptionThrows'
         Type: 'System.Boolean'  Value: 'True'
   [ExampleAttribute((ExampleKind)2, Note = "This is a note on the assembly.")]
      Constructor: 'Void .ctor(ExampleKind)'
      Constructor arguments:
         Type: 'ExampleKind'  Value: '2'
      Named arguments:
         MemberInfo: 'System.String Note'
         Type: 'System.String'  Value: 'This is a note on the assembly.'

Attributes for type: 'Test'
   [ExampleAttribute((ExampleKind)1, new String[3] { "String array argument, line 1", "String array argument, line 2", "String array argument, line 3" }, Note = "This is a note on the class.", Numbers = new Int32[3] { 53, 57, 59 })]
      Constructor: 'Void .ctor(ExampleKind, System.String[])'
      Constructor arguments:
         Type: 'ExampleKind'  Value: '1'
         Array of 'System.String[]':
             Type: 'System.String'  Value: 'String array argument, line 1'
             Type: 'System.String'  Value: 'String array argument, line 2'
             Type: 'System.String'  Value: 'String array argument, line 3'
      Named arguments:
         MemberInfo: 'System.String Note'
         Type: 'System.String'  Value: 'This is a note on the class.'
         MemberInfo: 'Int32[] Numbers'
         Array of 'System.Int32[]':
             Type: 'System.Int32'  Value: '53'
             Type: 'System.Int32'  Value: '57'
             Type: 'System.Int32'  Value: '59'

Attributes for member: 'Void TestMethod(System.Object)'
   [ExampleAttribute(Note = "This is a note on a method.")]
      Constructor: 'Void .ctor()'
      Constructor arguments:
      Named arguments:
         MemberInfo: 'System.String Note'
         Type: 'System.String'  Value: 'This is a note on a method.'

Attributes for parameter: 'System.Object arg'
   [ExampleAttribute()]
      Constructor: 'Void .ctor()'
      Constructor arguments:
      Named arguments:
*/

Remarques

Le code qui est examiné dans le contexte de réflexion uniquement ne peut pas être exécuté. Il n’est donc pas toujours possible d’examiner les attributs personnalisés en créant des instances d’eux, puis en examinant leurs propriétés, à l’aide de méthodes telles que Attribute.GetCustomAttributes, MemberInfo.GetCustomAttributes, et ainsi de suite. Si le code du type d’attribut lui-même est chargé dans le contexte de réflexion uniquement, il ne peut pas être exécuté.

La structure CustomAttributeNamedArgument est utilisée par la classe CustomAttributeData pour fournir l’accès à un argument nommé spécifié pour une instance d’attribut personnalisée, sans exécuter le code de la propriété correspondante du type d’attribut personnalisé. La propriété TypedValue retourne une structure CustomAttributeTypedArgument qui contient le type et la valeur de l’argument nommé.

Important

Si un argument est nommé ou positionnel, vous devez accéder à son type et à sa valeur à l’aide de la structure CustomAttributeTypedArgument.

Pour créer des instances de la classe CustomAttributeData, utilisez la méthode de fabrique staticGetCustomAttributes.

Constructeurs

CustomAttributeNamedArgument(MemberInfo, CustomAttributeTypedArgument)

Initialise une nouvelle instance de la classe CustomAttributeNamedArgument, qui représente le champ ou la propriété spécifié de l’attribut personnalisé et spécifie un objet CustomAttributeTypedArgument qui décrit le type et la valeur du champ ou de la propriété.

CustomAttributeNamedArgument(MemberInfo, Object)

Initialise une nouvelle instance de la classe CustomAttributeNamedArgument, qui représente le champ ou la propriété spécifié de l’attribut personnalisé et spécifie la valeur du champ ou de la propriété.

Propriétés

IsField

Obtient une valeur qui indique si l’argument nommé est un champ.

MemberInfo

Obtient le membre d’attribut qui serait utilisé pour définir l’argument nommé.

MemberName

Obtient le nom du membre d’attribut qui serait utilisé pour définir l’argument nommé.

TypedValue

Obtient une structure CustomAttributeTypedArgument qui peut être utilisée pour obtenir le type et la valeur de l’argument nommé actuel.

Méthodes

Equals(CustomAttributeNamedArgument)

Indique si l’instance actuelle est égale à une autre instance du même type.

Equals(Object)

Retourne une valeur qui indique si cette instance est égale à un objet spécifié.

GetHashCode()

Retourne le code de hachage pour cette instance.

ToString()

Retourne une chaîne qui se compose du nom de l’argument, du signe égal et d’une représentation sous forme de chaîne de la valeur d’argument.

Opérateurs

S’applique à

Produit Versions
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Voir aussi