В чем польза от размещения атрибутов для конкретных параметров метода? - PullRequest
5 голосов
/ 18 июня 2010

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

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

А как насчет атрибутов типа возвращаемого метода?

Ответы [ 5 ]

7 голосов
/ 18 июня 2010

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

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

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

3 голосов
/ 18 июня 2010

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

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

}

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

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

1 голос
/ 18 июня 2010

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

def Foo([required]p):
    pass

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

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

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

1 голос
/ 18 июня 2010

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

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

0 голосов
/ 18 июня 2010

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

public class Foo {
  [ImportingConstructor]
  public Foo([Import("main")] Bar bar) {
    ...
  }
}
...