Устранение неоднозначностей в целевых объектах атрибутов (Руководство по программированию на C#)
Обновлен: Ноябрь 2007
В определенных ситуациях целевые объекты атрибутов, то есть объекты, к которым применяются эти атрибуты, могут быть неоднозначными. Например, в следующем объявлении метода атрибут SomeAttr может быть применен к методу либо к возвращаемому им значению:
public class SomeAttr : System.Attribute { }
[SomeAttr]
int Method()
{
return 0;
}
Ситуации такого рода нередко возникают при маршалинге. Для устранения неоднозначности в C# предусмотрен ряд целевых объектов по умолчанию для каждого вида объявлений, которые могут быть переопределены явно заданными целевыми объектами атрибутов.
// default: applies to method
[SomeAttr]
int Method1() { return 0; }
// applies to method
[method: SomeAttr]
int Method2() { return 0; }
// applies to return value
[return: SomeAttr]
int Method3() { return 0; }
Обратите внимание, что при этом не учитывается, в каких целевых объектах атрибут SomeAttr определен как действительный; то есть даже если SomeAttr определен как применимый только к возвращаемым значениям, целевой объект return все равно должен быть указан. Другими словами, компилятор не будет использовать информацию AttributeUsage для разрешения неоднозначных целевых объектов атрибута. Дополнительные сведения см. в разделе AttributeUsage (Руководство по программированию на C#).
Синтаксис целевых объектов атрибута имеет следующий вид.
[target : attribute-list]
Параметры
target
Один из следующих: assembly, field, event, method, module, param, property, return, type.attribute-list
Список применимых атрибутов.
В приведенной ниже таблице перечислены все объявления, в которых разрешены атрибуты. Для каждого объявления во втором столбце перечислены возможные целевые объекты в объявлении. Жирным шрифтом выделены целевые объекты по умолчанию.
Объявление |
Возможные целевые объекты |
---|---|
assembly |
assembly |
module |
module |
class |
type |
struct |
type |
interface |
type |
enum |
type |
delegate |
type, return |
method |
method, return |
parameter |
param |
Field |
field |
property — indexer |
property |
property — get accessor |
method, return |
property — set accessor |
method, param, return |
event — field |
event, field, method |
event — property |
event, property |
event — add |
method, param |
event — remove |
method, param |
Атрибуты уровня сборки и модуля не имеют целевых объектов по умолчанию. Дополнительные сведения см. в разделе Глобальные атрибуты.
Пример
using System.Runtime.InteropServices;
[Guid("12345678-1234-1234-1234-123456789abc"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface ISampleInterface
{
[DispId(17)] // set the DISPID of the method
[return: MarshalAs(UnmanagedType.Interface)] // set the marshaling on the return type
object DoWork();
}
См. также
Основные понятия
Руководство по программированию в C#
Ссылки
Отражение (Руководство по программированию на C#)
Атрибуты (Руководство по программированию на C#)
Использование атрибутов (Руководство по программированию на C#)
Создание настраиваемых атрибутов (руководство по программированию в C#)
Доступ к атрибутам через отражение (Руководство по программированию в C#)