Как можно извлечь имя метода, к которому был применён атрибут?

Можно ли извлечь название метода ("Edit") внутри конструктора класса MyAuthorizeAttribute? <br/> <br/> <pre><code class="cs">public class MyAuthorizeAttribute : AuthorizeAttribute
{
  public MyAuthorizeAttribute() : base()
  {
    var s1 = ...;
    Debug.WriteLine($"Method name: {s1}");
  }
}</code></pre> <br/> <br/> <pre><code class="cs">[MyAuthorize]
[HttpGet("edit/{id:int}")]
public override ActionResult Edit(int id)
{
  return base.Edit(id);
}</code></pre>
  • 18 сентября 2024 г. 19:13
Ответы на вопрос 2
В .NET атрибуты являются статическим аспектом метаданных и их конструкторы вызываются во время компиляции, а не в момент вызова метода. Это значит, что атрибут не может самостоятельно узнать о методе, к которому он применяется, в момент его инстанцирования (в момент вызова конструктора атрибута). 

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

Вот несколько способов, как вы можете организовать получение имени метода, воспользовавшись `ActionFilterAttribute` или `IActionFilter`:

### Пример с `ActionFilterAttribute`:

```csharp
public class MyAuthorizeAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var actionDescriptor = context.ActionDescriptor;
        var methodName = actionDescriptor.RouteValues["action"];
        
        Debug.WriteLine($"Method name: {methodName}");

        base.OnActionExecuting(context);
    }
}
```

### Использование в контроллере:

```csharp
[MyAuthorize]
[HttpGet("edit/{id:int}")]
public override ActionResult Edit(int id)
{
    return base.Edit(id);
}
```

### Пояснение:

- В данном примере класс `MyAuthorizeAttribute` наследуется от `ActionFilterAttribute`. 
- Переопределяем метод `OnActionExecuting`, который будет вызываться перед выполнением действия.
- В этом методе мы можем получить `ActionDescriptor`, который предоставляет доступ к информации о текущем действии, включая его имя через `actionDescriptor.RouteValues["action"]`.

Таким образом, хотя атрибут не может получить имя метода во время своего создания, вы можете легко обрабатывать это в методах фильтров.
Никак. Атрибуты это мета информация и отдается она только по запросу
Похожие вопросы