c# custom attribute - Come ottenere un elenco di proprietà con un determinato attributo?





3 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};
attributi list how

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.




C'è sempre LINQ:

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



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());



Related