Estendere Type
Fin dalla versione 1.0 del Framework i custom attribute hanno riscosso un notevole successo tra gli sviluppatori che li hanno utilizzati per diversi scopi, come ad esempio definire il mapping delle classi sulle tabelle di un database.
Scopo di questo progetto è quello di permettere di memorizzare l’associazione tra custom attribute e codice in repository diversi come ad esempio un file xml o un database, senza però influire sul modo con cui si recuperano queste informazioni.
Per far ciò si è reso necessario estendere un classe molto importante, la classe Type. Questa nuova classe, chiamata XType, per poter svolgere il suo lavoro utilizzerà una classe provider specifica per il particolare repository da supportare.
Ad esempio per il seguente codice:
[Author("Antonio Di Motta")]
public class ExampleClass
{
[Example]
public void ExampleMethod() { }
}
Potremmo utilizzare un file xml:
<?xmlversion="1.0"encoding="utf-8" ?>
<types>
<typename="ExampleClass">
<attributename="AuthorAttribute, Adm.Test">
<paramvalue="Antonio Di Motta"></param>
</attribute>
<methodname="ExampleMethod">
<attributename="ExampleAttribute, Adm.Test" />
</method>
</type>
</types>
Infine per poter recuperare le informazioni:
ICustomAttributeProvider provider = new XmlCustomAttributeProvider( "metadata.xml" );
Type t = XType.GetXType( typeof(ExampleClass), provider );
object[] type_attrs = t.GetCustomAttributes( false );
MemberInfo[] members = t.GetMembers();
object[] method_attrs = members[0].GetCustomAttributes( false );
Per rendere la soluzione più flessibile è possibile configurare la scelta del provider dal file di configurazione:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="xtypeSection" type="Adm.XTypeSection, Adm"/>
</configSections>
<xtypeSection providerName="XmlCustomAttributeProvider" />
</configuration>
indietro