Friday, September 26, 2008

CodeDOM helper methods

The CodeDOM provides types that represent many common types of source code elements. You can design a program that builds a source code model using CodeDOM elements to assemble an object graph. This object graph can be rendered as source code using a CodeDOM code generator for a supported programming language. The CodeDOM can also be used to compile source code into a binary assembly.

This article contains some helper methods you can use to create a class using CodeDOM.

Creating a namespace

private CodeNamespace CreateNameSpace(String name)

{

CodeNamespace CurrentNameSpace = new CodeNamespace(name);

CurrentNameSpace.Imports.Add(new CodeNamespaceImport("System"));

CurrentNameSpace.Imports.Add(new CodeNamespaceImport("System.Text"));

CurrentNameSpace.Imports.Add(new CodeNamespaceImport("System.Collections.Generic"));

CurrentNameSpace.Imports.Add(new CodeNamespaceImport("System.IO"));

CurrentNameSpace.Imports.Add(new CodeNamespaceImport("System.Collections.Specialized"));

CurrentNameSpace.Imports.Add(new CodeNamespaceImport("System.Collections.ObjectModel"));

return CurrentNameSpace;

}

Or

private CodeNamespace CreateNameSpace(String name, CodeNamespaceImport[] imports)

{

CodeNamespace CurrentNameSpace = new CodeNamespace(name);

CurrentNameSpace.Imports.AddRange(imports);

return CurrentNameSpace;

}

Creating a class

private CodeTypeDeclaration CreateClass(String className)

{

CodeTypeDeclaration ctd = new CodeTypeDeclaration(className);

ctd.IsClass = true;

ctd.Attributes = MemberAttributes.Public;

return ctd;

}

Creating class variables

private CodeMemberField CreateClassVariable(System.Type type, String name)

{

CodeMemberField classVariable = new CodeMemberField(type, name);

classVariable.Attributes = MemberAttributes.Private;

return classVariable;

}

Create Properties

private CodeMemberProperty CreateClassProperty(Boolean isReadOnly, String name, Type type, String variableName)

{

CodeMemberProperty property = new CodeMemberProperty();

property.Name = name;

property.Type = new CodeTypeReference(type);

property.Attributes = MemberAttributes.Public;

property.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), variableName)));

if(!isReadOnly)

property.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), variableName), new CodePropertySetValueReferenceExpression()));

return property;

}

Creating methods

private CodeMemberMethod CreateMethod(String methodName, CodeTypeReference returnType, CodeParameterDeclarationExpressionCollection methodParams, MemberAttributes accessModifier)

{

CodeMemberMethod method = new CodeMemberMethod();

method.Name = methodName;

method.ReturnType = returnType;

method.Parameters.AddRange(methodParams);

method.Attributes = accessModifier;

return method;

}

No comments: