В .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"]`.
Таким образом, хотя атрибут не может получить имя метода во время своего создания, вы можете легко обрабатывать это в методах фильтров.