Auf Englisch lesen

Freigeben über


CustomAttributeData Klasse

Definition

Ermöglicht Zugriff auf benutzerdefinierte Attributdaten für Assemblys, Module, Typen, Member und Parameter, die in den Reflection-Only-Kontext geladen werden.

public class CustomAttributeData
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public sealed class CustomAttributeData
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public class CustomAttributeData
Vererbung
CustomAttributeData
Attribute

Beispiele

Im folgenden Beispiel wird ein benutzerdefiniertes Attribut mit vier Konstruktoren und vier Eigenschaften definiert. Zwei der Eigenschaften sind schreibgeschützt und werden mithilfe der Positionsparameter der Konstruktoren festgelegt. Die beiden anderen Eigenschaften sind Lese-/Schreibzugriff und können nur mithilfe benannter Argumente festgelegt werden. Eine Positionseigenschaft ist ein Array von Zeichenfolgen, und eine benannte Eigenschaft ist ein Array ganzzahliger Werte.

Das Attribut wird auf die Assembly angewendet sowie auf einen in der Assembly deklarierten Typ, eine Methode dieses Typs und einen Parameter der Methode. Für diese Fälle werden verschiedene Konstruktoren verwendet. Wenn sie ausgeführt wird, lädt sich die Assembly selbst in den Nur-Reflektionskontext und zeigt Informationen zu den benutzerdefinierten Attributen an, die auf sie und auf den typ und die Elemente angewendet wurden, die sie enthält.

Das Attribut, das auf den Typ angewendet wird, veranschaulicht Arrayeigenschaften mit positions- und benannten Argumenten.

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:
*/

Hinweise

Code, der im Nur-Spiegelungskontext untersucht wird, kann nicht ausgeführt werden. Daher ist es nicht immer möglich, benutzerdefinierte Attribute zu untersuchen, indem Instanzen von ihnen erstellt und dann ihre Eigenschaften mithilfe von Methoden wie Attribute.GetCustomAttributes, MemberInfo.GetCustomAttributesusw. untersucht werden. Wenn der Code für den Attributtyp selbst in den Kontext "Nur Reflektion" geladen wird, kann er nicht ausgeführt werden.

Die CustomAttributeData -Klasse ermöglicht die Untersuchung benutzerdefinierter Attribute im Reinreflektionskontext, indem eine Abstraktion für Attribute bereitgestellt wird. Die Member dieser Klasse können verwendet werden, um die Positionsargumente und benannten Argumente des Attributs abzurufen. Verwenden Sie die ConstructorArguments -Eigenschaft, um eine Liste von CustomAttributeTypedArgument Strukturen abzurufen, die die Positionsargumente darstellen, und verwenden Sie die NamedArguments -Eigenschaft, um eine Liste von CustomAttributeNamedArgument Strukturen abzurufen, die die benannten Argumente darstellen.

Hinweis

Die CustomAttributeNamedArgument -Struktur stellt nur Informationen zur Attributeigenschaft bereit, die zum Abrufen und Festlegen des Argumentwerts verwendet wird. Um den Typ und den Wert des Arguments abzurufen, verwenden Sie die CustomAttributeNamedArgument.TypedValue -Eigenschaft, um eine CustomAttributeTypedArgument Struktur abzurufen.

Wenn Sie über eine CustomAttributeTypedArgument Struktur für ein Argument verfügen, unabhängig davon, ob sie benannt oder positional ist, verwenden Sie die CustomAttributeTypedArgument.ArgumentType -Eigenschaft, um den Typ und die CustomAttributeTypedArgument.Value Eigenschaft abzurufen, um den Wert abzurufen.

Hinweis

Für ein Arrayargument gibt die CustomAttributeTypedArgument.Value -Eigenschaft ein generisches ReadOnlyCollection<T> Objekt zurück CustomAttributeTypedArgument . Jedes CustomAttributeTypedArgument Objekt in der Auflistung stellt das entsprechende Element des Arrays dar.

CustomAttributeData kann sowohl im Ausführungskontext als auch im Reinreflektionskontext verwendet werden. Beispielsweise sollten Sie das Laden der Assembly vermeiden, die den Code für ein benutzerdefiniertes Attribut enthält. Die Verwendung der CustomAttributeData -Klasse unterscheidet sich von der Verwendung von Methoden wie Attribute.GetCustomAttributes:

  • Die Eigenschaften und Methoden von CustomAttributeData stellen nur die Werte bereit, die für das Attribut instance angegeben wurden, nicht die Semantik des Konstruktors. Beispielsweise kann ein Zeichenfolgenargument eines Attributs intern in eine andere Darstellung konvertiert und in kanonischer Form zurückgegeben werden. oder eine Eigenschaft kann Nebenwirkungen haben, wenn der tatsächliche Attributcode ausgeführt wird.

  • Die Eigenschaften und Methoden von CustomAttributeData ermöglichen es Ihnen nicht, die von Basisklassen geerbten benutzerdefinierten Attribute abzurufen.

Verwenden Sie zum Erstellen von Instanzen der CustomAttributeData -Klasse die static Factorymethoden (Sharedin Visual Basic). GetCustomAttributes

Konstruktoren

CustomAttributeData()

Initialisiert eine neue Instanz der CustomAttributeData-Klasse.

Eigenschaften

AttributeType

Ruft den Attributtyp ab.

Constructor

Ruft ein ConstructorInfo-Objekt ab, das den Konstruktor darstellt, der das benutzerdefinierte Attribut initialisiert hätte.

ConstructorArguments

Ruft die Liste positioneller Argumente ab, die für die durch das CustomAttributeData-Objekt dargestellte Attributinstanz angegeben werden.

NamedArguments

Ruft die Liste benannter Argumente ab, die für die durch das CustomAttributeData-Objekt dargestellte Attributinstanz angegeben werden.

Methoden

Equals(Object)

Gibt einen Wert zurück, der angibt, ob diese Instanz gleich einem angegebenen Objekt ist.

Equals(Object)

Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist.

(Geerbt von Object)
GetCustomAttributes(Assembly)

Gibt eine Liste von CustomAttributeData-Objekten zurück, die Daten zu den Attributen darstellen, die auf die Zielassembly angewendet wurden.

GetCustomAttributes(MemberInfo)

Gibt eine Liste von CustomAttributeData-Objekten zurück, die Daten zu den Attributen darstellen, die auf den Zielmember angewendet wurden.

GetCustomAttributes(Module)

Gibt eine Liste von CustomAttributeData-Objekten zurück, die Daten zu den Attributen darstellen, die auf das Zielmodul angewendet wurden.

GetCustomAttributes(ParameterInfo)

Gibt eine Liste von CustomAttributeData-Objekten zurück, die Daten zu den Attributen darstellen, die auf den Zielparameter angewendet wurden.

GetHashCode()

Dient als Hashfunktion für einen bestimmten Typ.

GetHashCode()

Fungiert als Standardhashfunktion.

(Geerbt von Object)
GetType()

Ruft den Type der aktuellen Instanz ab.

(Geerbt von Object)
MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.

(Geerbt von Object)
ToString()

Gibt eine Zeichenfolgendarstellung des benutzerdefinierten Attributs zurück.

ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)

Gilt für:

Produkt Versionen
.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

Weitere Informationen