Прочитать на английском

Поделиться через


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
Наследование
CustomAttributeNamedArgument
Атрибуты
Реализации

Примеры

В следующем примере определяется настраиваемый атрибут с четырьмя конструкторами и четырьмя свойствами. Два свойства доступны только для чтения и задаются с помощью позиционных параметров конструкторов. Остальные два свойства — чтение и запись, и их можно задать только с помощью именованных аргументов. Одно позициальное свойство — это массив строк, а одно именованное свойство — массив целых чисел.

Атрибут применяется к сборке, к типу, объявленному в сборке, к методу типа и к параметру метода. Для этих случаев используются различные конструкторы. При выполнении сборка загружается в контекст только отражения и отображает сведения о настраиваемых атрибутах, примененных к нему, и к типу и элементам, которые он содержит.

Атрибут, применяемый к типу, демонстрирует свойства массива как с позициальными, так и именованными аргументами.

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

Комментарии

Код, который проверяется в контексте только отражения, не может быть выполнен, поэтому не всегда можно изучить пользовательские атрибуты, создавая экземпляры, а затем проверяя их свойства, используя такие методы, как Attribute.GetCustomAttributes, MemberInfo.GetCustomAttributesи т. д. Если код самого типа атрибута загружается в контекст только для отражения, его нельзя выполнить.

Структура CustomAttributeNamedArgument используется классом CustomAttributeData для предоставления доступа к именованным аргументам, указанным для пользовательского экземпляра атрибута, без выполнения кода соответствующего свойства пользовательского типа атрибута. Свойство TypedValue возвращает структуру CustomAttributeTypedArgument, содержащую тип и значение именованного аргумента.

Важно!

Независимо от того, является ли аргумент именованным или позициональным, необходимо получить доступ к его типу и значению с помощью структуры CustomAttributeTypedArgument.

Чтобы создать экземпляры класса CustomAttributeData, используйте метод фабрики staticGetCustomAttributes.

Конструкторы

CustomAttributeNamedArgument(MemberInfo, CustomAttributeTypedArgument)

Инициализирует новый экземпляр класса CustomAttributeNamedArgument, который представляет указанное поле или свойство пользовательского атрибута, и задает объект CustomAttributeTypedArgument, описывающий тип и значение поля или свойства.

CustomAttributeNamedArgument(MemberInfo, Object)

Инициализирует новый экземпляр класса CustomAttributeNamedArgument, который представляет указанное поле или свойство пользовательского атрибута и задает значение поля или свойства.

Свойства

IsField

Возвращает значение, указывающее, является ли именованный аргумент полем.

MemberInfo

Возвращает элемент атрибута, который будет использоваться для задания именованного аргумента.

MemberName

Возвращает имя элемента атрибута, который будет использоваться для задания именованного аргумента.

TypedValue

Получает CustomAttributeTypedArgument структуру, которую можно использовать для получения типа и значения текущего именованного аргумента.

Методы

Equals(CustomAttributeNamedArgument)

Указывает, равен ли текущий экземпляр другому экземпляру того же типа.

Equals(Object)

Возвращает значение, указывающее, равен ли этот экземпляр указанному объекту.

GetHashCode()

Возвращает хэш-код для этого экземпляра.

ToString()

Возвращает строку, состоящую из имени аргумента, знака равенства и строкового представления значения аргумента.

Операторы

Equality(CustomAttributeNamedArgument, CustomAttributeNamedArgument)

Проверяет, эквивалентны ли две структуры CustomAttributeNamedArgument.

Inequality(CustomAttributeNamedArgument, CustomAttributeNamedArgument)

Проверяет, отличаются ли две структуры CustomAttributeNamedArgument.

Применяется к

Продукт Версии
.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

См. также раздел