Ho appena finito di lavorare un pò su CodeDOM, una delle nuove features del .NET Framework 2.0 e devo dire che hanno inventato una gran bella cosa.
CodeDOM, che è l'acronimo di Code Document Object Model, permette di utilizzare un set di classi pre-costruite che possono rappresentare tutti gli elementi e la struttura di un documento di codice sorgente .NET, indipendentemente dal linguaggio in cui sarà scritto il sorgente finale. Esistono infatti classi per rappresentare metodi, proprietà, variabili e altri tipi di costrutti che, messi insieme, possono creare ogni tipo di documento di codice sorgente utile ai nostri scopi.
Il namespace che contiene questo tipo di classi è System.CodeDom.
Vediamo ora, un esempio di crearezione di una classe con una proprietà al suo interno:

CodeNamespace ns = new CodeNamespace("Peppe.Test");


//namespace da importare CodeNamespaceImport import = null;
import = new CodeNamespaceImport("System");
ns.Imports.Add(import);
import = new CodeNamespaceImport("System.Configuration");
ns.Imports.Add(import);

code.Namespaces.Add(ns);

//creazione della classe CodeTypeDeclaration miaClasse = new CodeTypeDeclaration("MiaClasse");
miaClasse.IsClass = true;

//creazione di un campo CodeMemberField myField = new CodeMemberField(typeof(System.Int32),"_id");
miaClasse .Members.Add(myField);

//creazione della proprietà CodeMemberProperty prop = new CodeMemberProperty();
prop.Name = "ID";
prop.Type = new CodeTypeReference(typeof(System.Int32));
prop.Attributes = MemberAttributes.Public;
prop.HasGet = true;
prop.HasSet = false;

miaClasse.Members.Add(prop);

CodeSnippetExpression getsnippet = new CodeSnippetExpression("return _id");
CodeSnippetExpression setsnippet = new CodeSnippetExpression("_id = value");
prop.GetStatements.Add(getsnippet);
prop.SetStatements.Add(setsnippet);

ns.Types.Add(miaClasse );

Questo codice CodeDom, una volta compilato, andrà a generare a run-time una classe così scritta:

namespace Peppe.Config

{
using System;
using System.Configuration;

public class MiaClasse
{
private int _id;

public int ID
{
get {return _id;}
set {_id = value;}
}
}
}

La classe generata l'ho scritta in C# per comodità, ma potrebbe venir generata in qualsiasi linguaggio compatibile con il .NET Framework.
La tecnica di utilizzo del CodeDOM risulta molto utile allegata ai BuildProviders di ASP.NET 2.