.NET e le... "riflessioni sugli attributi" :-)

Avete presente quando venite assaliti da un dubbio e (quasi) non riuscite a pensare ad altro? Ecco: immaginate che il dubbio riguardi una funzionalità di .NET e che MSDN non sia esaustivo al riguardo, immaginate che anche Raf (cui ho rotto le @@ via messenger) non vi sappia dare una risposta al volo... Concorderete con me che è uno di quei casi nei quali ci si sente *obbligati* a "mettere in piedi" un esempietto per: vedere, capire, ....SAPERE. Vaorainonda, il reality show: "Vita da Saltarello: riflessioni sugli attributi" (si, il doppio senso ambiguo carpiato è voluto ).

La causa scatenante di cotanto post è la domanda: "ma il metodo GetCustomAttributes() può restituire una *famiglia* di attributi?" Mi spiego meglio: molte classi tipiche della Reflection implementano l'interfaccia ICustomAttributeProvider, che espone una forma in overload del suddetto metodo avente la firma:

 GetCustomAttributes( System.Type attributeType , System.Boolean inherit )

Posso quindi specificare l'istanza di Type che qualifica una tipologia di attributo e sapere se il tipo o membro oggetto della mia "riflessione" sia stato decorato da esso (ricordiamoci che è possibile -dipendentemente dall'attributo- effettuare una decorazione multipla dello stesso tipo). La mia domanda, quindi è: "Mi saranno restituiti *solo* gli attributi di tipo attributeType o anche quelli di tipi da esso derivati?" (comodo se state creando una famiglia di classi attributo e del codice polimorfico che se ne avvale). Purtroppo, la documentazione del suddetto metodo in MSDN Library non menziona questo comportamento, quindi una verifica era d'obbligo. Ecco quindi un paio di attributi creati per l'occasione:

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
public abstract class BaseAttribute : Attribute
{
}

public class MyAttribute : BaseAttribute
{

}

public class MyClass
{
   private string property;

   [MyAttribute()]
   public string Field;

   [MyAttribute()]
   public string Property
   {
       get
       {
           return property;
       }
       set
      {
           property = value;
      }
   }
}

Infine, proviamo a analizzare il nostro codice mediante un "tocco" di reflection:

MyClass o = new MyClass();
Type objectType = o.GetType();
MemberInfo[] members = objectType.GetMembers();
foreach(MemberInfo member in members)
{
    Attribute[] attributes = (Attribute[]) member.GetCustomAttributes(typeof(BaseAttribute), true);
    foreach(Attribute attr in attributes)
    {
        Console.WriteLine(attr.GetType().Name);
    }
}

Ed ecco il responso finale:

MyAttribute
MyAttribute

Ora lo sappiamo: GetCustomAttributes può essere utilizzata per ottenere una famiglia di attributi. :-)

posted @ venerdì 1 luglio 2005 17:09

Print

Comments on this entry:

# re: .NET e le... "riflessioni sugli attributi" :-)

Left by Roberto Messora at 01/07/2005 21:19
Gravatar
E magari queste pensate sono dovute al fatto che ti stai "facendo" della robba bbbuona che ti ho lasciato l'altra sera... :-)
PS: sto preparando i titoli delle "songz" da mandarti via mail e anche il "resto", abbi fiducia.
PPS: Cmq grazie mille, anzi un milione
saluti

Your comment:



 (will not be displayed)


 
 
 
Please add 6 and 5 and type the answer here:
 

Live Comment Preview:

 
«dicembre»
domlunmarmergiovensab
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678