Reputation: 123
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
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
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