CustomAttributeNamedArgument Struct
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Vertegenwoordigt een benoemd argument van een aangepast kenmerk in de context alleen weerspiegeling.
public value class CustomAttributeNamedArgument
public value class CustomAttributeNamedArgument : IEquatable<System::Reflection::CustomAttributeNamedArgument>
public struct CustomAttributeNamedArgument
public readonly struct CustomAttributeNamedArgument : IEquatable<System.Reflection.CustomAttributeNamedArgument>
public readonly struct CustomAttributeNamedArgument
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public struct CustomAttributeNamedArgument
type CustomAttributeNamedArgument = struct
[<System.Runtime.InteropServices.ComVisible(true)>]
[<System.Serializable>]
type CustomAttributeNamedArgument = struct
Public Structure CustomAttributeNamedArgument
Public Structure CustomAttributeNamedArgument
Implements IEquatable(Of CustomAttributeNamedArgument)
- Overname
- Kenmerken
- Implementeringen
Voorbeelden
In het volgende voorbeeld wordt een aangepast kenmerk gedefinieerd met vier constructors en vier eigenschappen. Twee van de eigenschappen zijn alleen-lezen en worden ingesteld met behulp van de positionele parameters van de constructors. De andere twee eigenschappen zijn lezen/schrijven en kunnen alleen worden ingesteld met benoemde argumenten. Een positionele eigenschap is een matrix met tekenreeksen en één benoemde eigenschap is een matrix met gehele getallen.
Het kenmerk wordt toegepast op de assembly, op een type dat in de assembly is gedeclareerd, op een methode van het type en op een parameter van de methode. Voor deze gevallen worden verschillende constructors gebruikt. Wanneer de assembly wordt uitgevoerd, wordt de assembly geladen in de context alleen voor weerspiegeling en wordt informatie weergegeven over de aangepaste kenmerken die erop zijn toegepast en op het type en de leden die deze bevat.
Het kenmerk dat wordt toegepast op het type demonstreert matrixeigenschappen, met zowel positionele als benoemde 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:
*/
Imports System.Reflection
Imports System.Collections.Generic
Imports 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
End Enum
' An example attribute. The attribute can be applied to all
' targets, from assemblies to parameters.
'
<AttributeUsage(AttributeTargets.All)> _
Public Class ExampleAttribute
Inherits Attribute
' Data for properties.
Private kindValue As ExampleKind
Private noteValue As String
Private arrayStrings() As String
Private arrayNumbers() As Integer
' Constructors. The parameterless constructor (.ctor) calls
' the constructor that specifies ExampleKind and an array of
' strings, and supplies the default values.
'
Public Sub New(ByVal initKind As ExampleKind, ByVal initStrings() As String)
kindValue = initKind
arrayStrings = initStrings
End Sub
Public Sub New(ByVal initKind As ExampleKind)
Me.New(initKind, Nothing)
End Sub
Public Sub New()
Me.New(ExampleKind.FirstKind, Nothing)
End Sub
' Properties. The Note and Numbers properties must be read/write, so they
' can be used as named parameters.
'
Public ReadOnly Property Kind As ExampleKind
Get
Return kindValue
End Get
End Property
Public ReadOnly Property Strings As String()
Get
Return arrayStrings
End Get
End Property
Public Property Note As String
Get
Return noteValue
End Get
Set
noteValue = value
End Set
End Property
Public Property Numbers As Integer()
Get
Return arrayNumbers
End Get
Set
arrayNumbers = value
End Set
End Property
End Class
' 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 Integer() { 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 Sub TestMethod(<Example()> ByVal arg As Object)
End Sub
' Sub 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 Shared Sub Main()
Dim asm As [Assembly] = Assembly.ReflectionOnlyLoad("source")
Dim t As Type = asm.GetType("Test")
Dim m As MethodInfo = t.GetMethod("TestMethod")
Dim p() As ParameterInfo = m.GetParameters()
Console.WriteLine(vbCrLf & "Attributes for assembly: '{0}'", asm)
ShowAttributeData(CustomAttributeData.GetCustomAttributes(asm))
Console.WriteLine(vbCrLf & "Attributes for type: '{0}'", t)
ShowAttributeData(CustomAttributeData.GetCustomAttributes(t))
Console.WriteLine(vbCrLf & "Attributes for member: '{0}'", m)
ShowAttributeData(CustomAttributeData.GetCustomAttributes(m))
Console.WriteLine(vbCrLf & "Attributes for parameter: '{0}'", p)
ShowAttributeData(CustomAttributeData.GetCustomAttributes(p(0)))
End Sub
Private Shared Sub ShowAttributeData( _
ByVal attributes As IList(Of CustomAttributeData))
For Each cad As CustomAttributeData _
In CType(attributes, IEnumerable(Of CustomAttributeData))
Console.WriteLine(" {0}", cad)
Console.WriteLine(" Constructor: '{0}'", cad.Constructor)
Console.WriteLine(" Constructor arguments:")
For Each cata As CustomAttributeTypedArgument _
In CType(cad.ConstructorArguments, IEnumerable(Of CustomAttributeTypedArgument))
ShowValueOrArray(cata)
Next
Console.WriteLine(" Named arguments:")
For Each cana As CustomAttributeNamedArgument _
In CType(cad.NamedArguments, IEnumerable(Of CustomAttributeNamedArgument))
Console.WriteLine(" MemberInfo: '{0}'", _
cana.MemberInfo)
ShowValueOrArray(cana.TypedValue)
Next
Next
End Sub
Private Shared Sub ShowValueOrArray(ByVal cata As CustomAttributeTypedArgument)
If cata.Value.GetType() Is GetType(ReadOnlyCollection(Of CustomAttributeTypedArgument)) Then
Console.WriteLine(" Array of '{0}':", cata.ArgumentType)
For Each cataElement As CustomAttributeTypedArgument In cata.Value
Console.WriteLine(" Type: '{0}' Value: '{1}'", _
cataElement.ArgumentType, cataElement.Value)
Next
Else
Console.WriteLine(" Type: '{0}' Value: '{1}'", _
cata.ArgumentType, cata.Value)
End If
End Sub
End Class
' 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:
Opmerkingen
Code die wordt onderzocht in de context met alleen reflecties, kan niet worden uitgevoerd, dus het is niet altijd mogelijk om aangepaste kenmerken te onderzoeken door exemplaren van deze kenmerken te maken en vervolgens hun eigenschappen te onderzoeken, met behulp van methoden zoals Attribute.GetCustomAttributes, MemberInfo.GetCustomAttributesenzovoort. Als de code voor het kenmerktype zelf wordt geladen in de context alleen weerspiegeling, kan deze niet worden uitgevoerd.
De CustomAttributeNamedArgument structuur wordt door de CustomAttributeData klasse gebruikt om toegang te bieden tot een benoemd argument dat is opgegeven voor een exemplaar van een aangepast kenmerk, zonder dat de code van de bijbehorende eigenschap van het aangepaste kenmerktype wordt uitgevoerd. De TypedValue eigenschap retourneert een CustomAttributeTypedArgument structuur die het type en de waarde van het benoemde argument bevat.
Important
Ongeacht of een argument een naam heeft of positioneel is, moet u het type en de waarde ervan openen met behulp van de CustomAttributeTypedArgument structuur.
Als u exemplaren van de CustomAttributeData klasse wilt maken, gebruikt u de staticGetCustomAttributes factory-methode.
Constructors
| Name | Description |
|---|---|
| CustomAttributeNamedArgument(MemberInfo, CustomAttributeTypedArgument) |
Initialiseert een nieuw exemplaar van de CustomAttributeNamedArgument klasse, dat het opgegeven veld of de eigenschap van het aangepaste kenmerk vertegenwoordigt en geeft een CustomAttributeTypedArgument object op dat het type en de waarde van het veld of de eigenschap beschrijft. |
| CustomAttributeNamedArgument(MemberInfo, Object) |
Initialiseert een nieuw exemplaar van de CustomAttributeNamedArgument klasse, dat het opgegeven veld of de eigenschap van het aangepaste kenmerk vertegenwoordigt en geeft de waarde van het veld of de eigenschap op. |
Eigenschappen
| Name | Description |
|---|---|
| IsField |
Hiermee wordt een waarde opgehaald die aangeeft of het benoemde argument een veld is. |
| MemberInfo |
Hiermee wordt het kenmerklid opgehaald dat wordt gebruikt om het benoemde argument in te stellen. |
| MemberName |
Hiermee haalt u de naam op van het kenmerklid dat wordt gebruikt om het benoemde argument in te stellen. |
| TypedValue |
Hiermee haalt u een CustomAttributeTypedArgument structuur op die kan worden gebruikt om het type en de waarde van het huidige benoemde argument te verkrijgen. |
Methoden
| Name | Description |
|---|---|
| Equals(CustomAttributeNamedArgument) |
Geeft aan of het huidige exemplaar gelijk is aan een ander exemplaar van hetzelfde type. |
| Equals(Object) |
Retourneert een waarde die aangeeft of dit exemplaar gelijk is aan een opgegeven object. |
| GetHashCode() |
Retourneert de hash-code voor dit exemplaar. |
| ToString() |
Retourneert een tekenreeks die bestaat uit de argumentnaam, het gelijkteken en een tekenreeksweergave van de argumentwaarde. |
Operators
| Name | Description |
|---|---|
| Equality(CustomAttributeNamedArgument, CustomAttributeNamedArgument) |
Hiermee wordt getest of twee CustomAttributeNamedArgument structuren gelijkwaardig zijn. |
| Inequality(CustomAttributeNamedArgument, CustomAttributeNamedArgument) |
Test of twee CustomAttributeNamedArgument structuren verschillen. |