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


Устранение неоднозначностей в целевых объектах атрибутов (Руководство по программированию на 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#)

System.Reflection

Attribute