StackOverflow4855
StackOverflow4855

Reputation: 123

How to get custom attributes for a controller in asp.net core rc2

I have created a custom attribute :

[AttributeUsage(AttributeTargets.Method| AttributeTargets.Class)]
public class ActionAttribute : ActionFilterAttribute
{
    public int Id { get; set; }
    public string Work { get; set; }
}

my controller :

[Area("Administrator")]
[Action(Id = 100, Work = "Test")]
public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

my code : i use reflection to find all Controllers in the current assembly

 Assembly.GetEntryAssembly()
         .GetTypes()
         .AsEnumerable()
         .Where(type => typeof(Controller).IsAssignableFrom(type))
         .ToList()
         .ForEach(d =>
         {
             // how to get ActionAttribute ?
         });

is it possible to read all the ActionAttribute pragmatically?

Upvotes: 11

Views: 11775

Answers (2)

Sander Visser
Sander Visser

Reputation: 4320

The currently answer doesn't always work, but depends which entry point you use of your application. (It will break as example on unit tests).

To get all classes in the same assembly where your attribute is defined

var assembly = typeof(MyCustomAttribute).GetTypeInfo().Assembly;
foreach (var type in assembly.GetTypes())
{
  var attribute = type.GetTypeInfo().GetCustomAttribute<MyCustomAttribute>();
  if (attribute != null)
  {
      _definedPackets.Add(attribute.MarshallIdentifier, type);
  }
}

Upvotes: 0

MaKCbIMKo
MaKCbIMKo

Reputation: 2820

To get an attributes from the class you can do something the following:

typeof(youClass).GetCustomAttributes<YourAttribute>();
// or
// if you need only one attribute
typeof(youClass).GetCustomAttribute<YourAttribute>();

it will return IEnumerable<YourAttribute>.

So, within your code it will be something like:

Assembly.GetEntryAssembly()
        .GetTypes()
        .AsEnumerable()
        .Where(type => typeof(Controller).IsAssignableFrom(type))
        .ToList()
        .ForEach(d =>
        {
            var yourAttributes = d.GetCustomAttributes<YourAttribute>();
            // do the stuff
        });

Edit:

In case with CoreCLR you need to call one more method, because the API has been changed a bit:

typeof(youClass).GetTypeInfo().GetCustomAttributes<YourAttribute>();

Upvotes: 19

Related Questions