Пытаюсь разобраться в использовании AttributesНемного лучше.
Я это понимаю:
Attributes в моем коде используя отражение.Теперь я хочу сделать еще кое-что с атрибутами, и мне интересно:
DllImportAttribute или STAThread) выполняют свои функции? Потому что мы просто используем эти атрибуты, и выполняются соответствующие функции. например С помощью DllImportAttribute я просто заявляю, что моему методу abc() нужен xyz.dll и соответствующая DLL загружена. Я не писал код для поиска и загрузки DLL xyz.dll.Похоже, вы хотите использовать атрибуты для указания определенного кода, который будет запускаться до / после / при условии выполнения метода, верно? Google для код контракта C#.
@Sinatr Хорошо, я создал отдельный вопрос для Аннотации здесь. Я обновлю этот вопрос для C# (ясность кода и вопроса), так как по этому вопросу мы обсуждаем ответ @MichaelRandall для Attributes в C# .NET.
@MichaelRandall Я хочу понять, как я могу создать свой настраиваемый атрибут, чтобы среда выполнения .NET уведомляла меня, когда мой настраиваемый атрибут используется в коде. Я обновил свой вопрос для большей ясности.
Неинтуитивное требование состоит в том, что должен быть код некоторый, который использует Reflection, чтобы найти атрибут обратно. Этот код часто очень хорошо спрятан. Как [DllImport], встроенный в джиттер. [STAThread], встроенный в CLR. Также, скажем, [Browsable], встроенный в элемент управления PropertyGrid, [AssemblyVersion], встроенный в компилятор C#. Этот вид кода отражения не расширяется простыми смертными. Так что «запустить специальный метод» на самом деле не в картах. Вы можете подумать о перезаписчике IL, PostSharp - это продукт, который это делает.
@HansPassant Спасибо за эту информацию. Не могли бы вы дать ссылку на эту информацию?
@HansPassant Я имел в виду Этот код часто очень хорошо спрятан. Как [DllImport], встроенный в джиттер. [STAThread], встроенный в CLR. Также, скажем, [Browsable], встроенный в элемент управления PropertyGrid, [AssemblyVersion], встроенный в компилятор C#.





На самом деле нет никакой загадки ...
Атрибут на самом деле является объектом, который связан с любым из этих элементов: 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 специальная поддержка такие предопределенные атрибуты? Если да, то Есть ли какой-либо механизм, позволяющий добавить такую поддержку для определенных пользователем атрибутов?
Я понимаю, что могу использовать Reflections, а затем если мне нужно использовать явно. Но когда эти размышления вызывается для таких атрибутов, как DllImportAttribute или STAThread? А кто это называет? Компиляторы .NET, среда выполнения .NET или что-то еще?
@cse Да, фреймворк, где-то в глубине души. вы можете поискать код фреймворка в исходном коде Microsoft.
Да, есть более квалифицированные люди, чтобы сказать, но он просто используется, как и все остальные могут использовать атрибуты. и я сомневаюсь, что это был бы особый случай. это мое предположение
@Sinatr Я намерен использовать сделать что-нибудь за кулисами, как в случае с DllImportAttribute или STAThread. Я просто хочу понять, что .NET предоставляет особые привилегии для встроенных аннотаций, или мы также можем сделай что-нибудь вроде этого с пользовательскими аннотациями?
Нет никаких закулисных атрибутов, это всего лишь метаданные времени выполнения.
@MichaelRandall Как указано в вашем примере, заранее известно, что какой класс использует настраиваемый атрибут? Но я не знаю заранее, какие другие классы используют мой настраиваемый атрибут. Более того, может случиться так, что какой-то другой пользователь определит свой класс в будущем, используя настраиваемый атрибут.
Я не знаю java и понятия не имею, в чем ваша проблема с атрибутами. Для меня это звучит как немного, лучше задать 2 вопроса.