Lire en anglais

Partager via


CustomAttributeTypedArgument Structure

Définition

Représente un argument d’un attribut personnalisé dans le contexte de réflexion uniquement ou un élément d’un argument de tableau.

C#
public struct CustomAttributeTypedArgument
C#
public readonly struct CustomAttributeTypedArgument : IEquatable<System.Reflection.CustomAttributeTypedArgument>
C#
public readonly struct CustomAttributeTypedArgument
C#
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public struct CustomAttributeTypedArgument
Héritage
CustomAttributeTypedArgument
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 les attributs personnalisés.

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 au type et à la valeur d’un argument positionnel spécifié pour une instance d’attribut personnalisée, sans exécuter le constructeur d’attribut. Il fournit également l’accès au type et à la valeur d’un argument nommé sans exécuter le code de la propriété correspondante du type d’attribut personnalisé.

Les types et valeurs de tous les arguments positionnels et nommés d’une instance d’attribut sont fournis par CustomAttributeTypedArgument structures. Les attributs positionnels retournés par la propriété CustomAttributeData.ConstructorArguments sont directement représentés par des structures CustomAttributeTypedArgument, mais les arguments nommés retournés par la propriété CustomAttributeData.NamedArguments sont représentés par des structures CustomAttributeNamedArgument ; pour obtenir la structure CustomAttributeTypedArgument pour un argument nommé, utilisez la propriété CustomAttributeNamedArgument.TypedValue.

Si un argument est un tableau de valeurs, la propriété Value du CustomAttributeTypedArgument qui représente l’argument retourne une ReadOnlyCollection<T> générique d’objets CustomAttributeTypedArgument. Chaque objet CustomAttributeTypedArgument de la collection représente l’élément correspondant du tableau.

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

Constructeurs

CustomAttributeTypedArgument(Object)

Initialise une nouvelle instance de la classe CustomAttributeTypedArgument avec la valeur spécifiée.

CustomAttributeTypedArgument(Type, Object)

Initialise une nouvelle instance de la classe CustomAttributeTypedArgument avec le type et la valeur spécifiés.

Propriétés

ArgumentType

Obtient le type de l’argument ou de l’élément d’argument de tableau.

Value

Obtient la valeur de l’argument pour un argument simple ou pour un élément d’un argument de tableau ; obtient une collection de valeurs pour un argument de tableau.

Méthodes

Equals(CustomAttributeTypedArgument)

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

Equals(Object)

Indique si cette instance et un objet spécifié sont égaux.

GetHashCode()

Retourne le code de hachage pour cette instance.

ToString()

Retourne une chaîne composée 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, 10
.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