[C#] Come ottenere un elenco di proprietà con un determinato attributo?


Answers

La soluzione che uso per la maggior parte si basa sulla risposta di Tomas Petricek. Di solito voglio fare qualcosa con l'attributo e la proprietà.

var props = from p in this.GetType().GetProperties()
            let attr = p.GetCustomAttributes(typeof(MyAttribute), true)
            where attr.Length == 1
            select new { Property = p, Attribute = attr.First() as MyAttribute};
Question

Ho un tipo, t , e mi piacerebbe ottenere un elenco delle proprietà pubbliche che hanno l'attributo MyAttribute . L'attributo è contrassegnato con AllowMultiple = false , come questo:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]

Attualmente quello che ho è questo, ma penso che ci sia un modo migliore:

foreach (PropertyInfo prop in t.GetProperties())
{
    object[] attributes = prop.GetCustomAttributes(typeof(MyAttribute), true);
    if (attributes.Length == 1)
    {
         //Property with my custom attribute
    }
}

Come posso migliorare questo? Le mie scuse se questo è un duplicato, ci sono un sacco di thread di riflessione là fuori ... sembra che sia un argomento piuttosto caldo.




Oltre alle risposte precedenti: è meglio usare il metodo Any() invece di controllare la lunghezza della raccolta:

propertiesWithMyAttribute = type.GetProperties()
  .Where(x => x.GetCustomAttributes(typeof(MyAttribute), true).Any());



C'è sempre LINQ:

t.GetProperties().Where(
    p=>p.GetCustomAttributes(typeof(MyAttribute), true).Length != 0)