Понимание использования «атрибутов»

Пытаюсь разобраться в использовании AttributesНемного лучше. Я это понимаю:

Теперь я хочу сделать еще кое-что с атрибутами, и мне интересно:

  • Как предопределенные атрибуты (например, DllImportAttribute или STAThread) выполняют свои функции? Потому что мы просто используем эти атрибуты, и выполняются соответствующие функции. например С помощью DllImportAttribute я просто заявляю, что моему методу abc() нужен xyz.dll и соответствующая DLL загружена. Я не писал код для поиска и загрузки DLL xyz.dll.
  • Доза Среда выполнения .NET или компиляторы предоставляют особый уход предопределенным атрибутам? Здесь под особый уход я имел в виду, что доза Среда выполнения .NET или компиляторы обнаруживают, что в коде используются некоторые предопределенные атрибуты, и запускают соответствующий метод?
  • Если да, то как я могу предоставить / добавить такую ​​информацию с помощью .NET Runtime Environment или компиляторов (даже если только на моем локальном ПК), чтобы он запускал специальный метод всякий раз, когда мой пользовательский атрибут используется в любом проекте?

Я не знаю java и понятия не имею, в чем ваша проблема с атрибутами. Для меня это звучит как немного, лучше задать 2 вопроса.

Sinatr 14.03.2018 11:42

Похоже, вы хотите использовать атрибуты для указания определенного кода, который будет запускаться до / после / при условии выполнения метода, верно? Google для код контракта C#.

Sinatr 14.03.2018 11:47

@Sinatr Хорошо, я создал отдельный вопрос для Аннотации здесь. Я обновлю этот вопрос для C# (ясность кода и вопроса), так как по этому вопросу мы обсуждаем ответ @MichaelRandall для Attributes в C# .NET.

cse 14.03.2018 13:27

@MichaelRandall Я хочу понять, как я могу создать свой настраиваемый атрибут, чтобы среда выполнения .NET уведомляла меня, когда мой настраиваемый атрибут используется в коде. Я обновил свой вопрос для большей ясности.

cse 14.03.2018 20:57

Неинтуитивное требование состоит в том, что должен быть код некоторый, который использует Reflection, чтобы найти атрибут обратно. Этот код часто очень хорошо спрятан. Как [DllImport], встроенный в джиттер. [STAThread], встроенный в CLR. Также, скажем, [Browsable], встроенный в элемент управления PropertyGrid, [AssemblyVersion], встроенный в компилятор C#. Этот вид кода отражения не расширяется простыми смертными. Так что «запустить специальный метод» на самом деле не в картах. Вы можете подумать о перезаписчике IL, PostSharp - это продукт, который это делает.

Hans Passant 15.05.2018 12:32

@HansPassant Спасибо за эту информацию. Не могли бы вы дать ссылку на эту информацию?

cse 15.05.2018 19:56
postsharp.net
Hans Passant 15.05.2018 19:59

@HansPassant Я имел в виду Этот код часто очень хорошо спрятан. Как [DllImport], встроенный в джиттер. [STAThread], встроенный в CLR. Также, скажем, [Browsable], встроенный в элемент управления PropertyGrid, [AssemblyVersion], встроенный в компилятор C#.

cse 16.05.2018 15:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
8
136
1

Ответы 1

На самом деле нет никакой загадки ...

Атрибут на самом деле является объектом, который связан с любым из этих элементов: Assembly, Class, Method, Delegate, Enum, Event, Field, Interface, Property и Struct.

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

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

Из MSDN Атрибуты (C#)

Attributes provide a powerful method of associating metadata, or declarative information, with code (assemblies, types, methods, properties, and so forth). After an attribute is associated with a program entity, the attribute can be queried at run time by using a technique called reflection. For more information, see Reflection (C#).

Attributes have the following properties:

  • Attributes add metadata to your program. Metadata is information about the types defined in a program. All .NET assemblies contain a specified set of metadata that describes the types and type members defined in the assembly. You can add custom attributes to specify any additional information that is required. For more information, see, Creating Custom Attributes (C#).

  • You can apply one or more attributes to entire assemblies, modules, or smaller program elements such as classes and properties.

  • Attributes can accept arguments in the same way as methods and properties.

Your program can examine its own metadata or the metadata in other programs by using reflection. For more information, see Accessing Attributes by Using Reflection (C#).

Если вы хотите получать информацию о метаданных, хранящихся в атрибуте, вам нужно сделать что-то вроде этого

Exmaple

Снято с Как прочитать атрибут класса во время выполнения?

[DomainName("MyTable")]
Public class MyClass : DomainBase
{}

...

public static class AttributeExtensions
{
    public static TValue GetAttributeValue<TAttribute, TValue>(
        this Type type, 
        Func<TAttribute, TValue> valueSelector) 
        where TAttribute : Attribute
    {
        var att = type.GetCustomAttributes(
            typeof(TAttribute), true
        ).FirstOrDefault() as TAttribute;
        if (att != null)
        {
            return valueSelector(att);
        }
        return default(TValue);
    }
}

и используйте вот так:

string name = typeof(MyClass).GetAttributeValue((DomainNameAttribute dna) => dna.Name);

Интересно как загадочно обрабатываются некоторые атрибуты? например DllImportAttribute или STAThread. Есть ли у компиляторов .NET специальная поддержка такие предопределенные атрибуты? Если да, то Есть ли какой-либо механизм, позволяющий добавить такую ​​поддержку для определенных пользователем атрибутов?

cse 14.03.2018 11:32

Я понимаю, что могу использовать Reflections, а затем если мне нужно использовать явно. Но когда эти размышления вызывается для таких атрибутов, как DllImportAttribute или STAThread? А кто это называет? Компиляторы .NET, среда выполнения .NET или что-то еще?

cse 14.03.2018 11:39

@cse Да, фреймворк, где-то в глубине души. вы можете поискать код фреймворка в исходном коде Microsoft.

TheGeneral 14.03.2018 11:41

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

TheGeneral 14.03.2018 11:43
«Но когда эти отражения вызываются для таких атрибутов, как DllImportAttribute или STAThread» - они используются инфраструктурой .net, вам все равно, когда они вызываются, вам нужно указать их только для достижения определенных целей.
Sinatr 14.03.2018 11:44

@Sinatr Я намерен использовать сделать что-нибудь за кулисами, как в случае с DllImportAttribute или STAThread. Я просто хочу понять, что .NET предоставляет особые привилегии для встроенных аннотаций, или мы также можем сделай что-нибудь вроде этого с пользовательскими аннотациями?

cse 14.03.2018 11:48

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

TheGeneral 14.03.2018 11:49

@MichaelRandall Как указано в вашем примере, заранее известно, что какой класс использует настраиваемый атрибут? Но я не знаю заранее, какие другие классы используют мой настраиваемый атрибут. Более того, может случиться так, что какой-то другой пользователь определит свой класс в будущем, используя настраиваемый атрибут.

cse 14.03.2018 21:04

Другие вопросы по теме