[ System.CodeDom ] – exemple de génération de code
Ajouter les deux imports :
using System.CodeDom;
using System.CodeDom.Compiler;
Le but de cet exemple est de présenter avant tout quelques utilisations
I préparation du code à générer
|
// 1 Namespace
CodeNamespace _namespace = new CodeNamespace("MyNamespace");
// ajout d'imports
_namespace.Imports.Add(new CodeNamespaceImport("System.Text"));
// 2 création d'une classe
CodeTypeDeclaration _class = new CodeTypeDeclaration("Contact");
_class.Attributes = MemberAttributes.Public;
_class.Comments.Add(new CodeCommentStatement("mon commentaire 1"));
// a - ajout de fields à la classe
_class.Members.Add(new CodeMemberField(new CodeTypeReference(typeof(string)), "_contactName"));
// b - ajout de properties à la
classe
CodeMemberProperty property1=new CodeMemberProperty();
property1.Attributes = MemberAttributes.Public |
MemberAttributes.Final;
property1.Name = "ContactName";
property1.Type = new CodeTypeReference(typeof(string));
property1.HasGet = true;
property1.HasSet = true;
// get
property1.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new
CodeThisReferenceExpression(),"_contactName")));
// set
property1.SetStatements.Add(new CodeAssignStatement(
new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),"_contactName"),
new CodePropertySetValueReferenceExpression()));
_class.Members.Add(property1);
// c - ajout de methodes à la
classe
CodeMemberMethod method1 = new CodeMemberMethod();
method1.Attributes = MemberAttributes.Public |
MemberAttributes.Static;
method1.ReturnType = new CodeTypeReference(typeof(string));
method1.Name = "GetContactName";
method1.Statements.Add(new CodeSnippetStatement("this._contactName="Romagny";"));
method1.Statements.Add(new CodeMethodReturnStatement(new CodeArgumentReferenceExpression("this._contactName")));
|
II génération du code
|
StringBuilder stringBuilder = new StringBuilder();
StringWriter stringWriter = new StringWriter(stringBuilder);
CSharpCodeProvider provider = new CSharpCodeProvider();
//
CodeGeneratorOptions options = new CodeGeneratorOptions();
options.BracingStyle = "C";
options.IndentString = " ";
provider.GenerateCodeFromNamespace(_namespace,stringWriter, options);
richTextBox1.Text = stringBuilder.ToString();
|
ici je me contente d'afficher le code dans une richtextbox
voici la sortie affichée
|
namespace MyNamespace
{
using System.Text;
// mon commentaire 1
public class Contact
{
private string _contactName;
public string ContactName
{
get
{
return this._contactName;
}
set
{
this._contactName = value;
}
}
public static string GetContactName()
{
this._contactName="Romagny";
return this._contactName;
}
}
}
|
http://msdn2.microsoft.com/fr-fr/library/system.codedom(VS.80).aspx
