Какова полноценность размещения атрибутов на определенных параметрах метода?

Я ищу список разумных вариантов использования помещения атрибутов в параметре.

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

И что относительно атрибутов на типе возврата метода?

5
задан jpbochi 17 June 2010 в 20:21
поделиться

5 ответов

Конкретный случай, когда они используются, - это PInvoke. Параметры в сигнатурах PInvoke могут быть дополнительно украшены дополнительной информацией с помощью атрибутов, так что маршалинг отдельных аргументов PInvoke может быть либо явно указан, либо иметь переопределение поведения маршаллинга по умолчанию, например:

[DllImport("yay.dll")]
public static extern int Bling([MarshalAs(UnmanagedType.LPStr)] string woo);   

Это отменяет поведение маршалинга по умолчанию для строки аргумент "Ву".

7
ответ дан 18 December 2019 в 16:36
поделиться

Например, в Vici MVC , платформе .NET MVC, параметры метода действия контроллера могут быть «сопоставлены» с параметром с другим именем. Вот как это делается в Vici MVC:

public void ActionMethod([Parameter("user")] int userId)
{

}

Это сопоставит параметр «пользователь» из строки запроса с параметром userId .

Это всего лишь простой пример того, как вы можете использовать атрибуты для параметров.

3
ответ дан 18 December 2019 в 16:36
поделиться

В Boo вы можете добавлять атрибуты макросов. Например:

def Foo([required]p):
    pass

Это говорит компилятору преобразовать метод Foo в следующий:

def Foo(p):
    raise ArgumentNullException("p") if p is null

Немного отличается от статических примеров, но, тем не менее, интересен.

1
ответ дан 18 December 2019 в 16:36
поделиться

Как показали другие, ответ на вопрос, для чего хороша та или иная вещь, может быть дан тем, что другие люди делают с ней. Например, в MEF вы можете использовать его в параметре конструктора, чтобы указать, что вы хотите импортировать зависимость с определенным именем:

public class Foo {
  [ImportingConstructor]
  public Foo([Import("main")] Bar bar) {
    ...
  }
}
0
ответ дан 18 December 2019 в 16:36
поделиться

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

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

1
ответ дан 18 December 2019 в 16:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: