stevem wrote:
This problem is particularly annoying because it's exactly how the CSharpCodeGenerator likes to format its output. Thus, if you're generating code via CodeDom and have accidentally created a type with the same name as it's enclosing namespace, the generated code will be unable to compile! Grr.
Day late and dollar short to be the hero on this one, but to back up stevem here is a little bit of code I use to create "template" files. I have an exe that uses this class to create .cs files for me. Saves me the typing and gets right to the code. <note>First time posting code, forgive me if it comes off formatted poorly</note>
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
namespace CodeGenerator
{/// <summary>
/// Summary description for DOM.
/// </summary>
public class DOM
{private string fileName;
private CodeCompileUnit codeCompileUnit;
private CodeNamespace codeNamespace;
private CodeDomProvider codeDomProvider;
private ICodeGenerator generator;
public DOM()
{codeCompileUnit = new CodeCompileUnit();
codeNamespace = new CodeNamespace();
codeNamespace.Name = "DefaultNamespace";
}
public string Namespace
{get { return this.codeNamespace.Name; }set { this.codeNamespace.Name = value;}}
public string FileName
{get { return this.fileName; }set { this.fileName = value; }}
public void AddUsingStatement(string import)
{CodeNamespaceImport newImport = new CodeNamespaceImport(import);
this.codeNamespace.Imports.Add(newImport);
}
public void AddType(string type)
{CodeTypeDeclaration newType = new CodeTypeDeclaration(type);
this.codeNamespace.Types.Add(newType);
CodeConstructor constructor = new CodeConstructor();
constructor.Name = type;
constructor.Attributes = MemberAttributes.Public;
this.codeNamespace.Types[0].Members.Add(constructor);
}
public void AddMember(string type, string name)
{CodeMemberField codeMemberField = new CodeMemberField(type,name.ToLower());
this.codeNamespace.Types[0].Members.Add(codeMemberField);
CodeMemberProperty codeMemberProperty = new CodeMemberProperty();
codeMemberProperty.Name = name;
codeMemberProperty.Type = new CodeTypeReference(type);
codeMemberProperty.Attributes = MemberAttributes.Public;
codeMemberProperty.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),name.ToLower())));
codeMemberProperty.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),name.ToLower()),new CodePropertySetValueReferenceExpression()));
this.codeNamespace.Types[0].Members.Add(codeMemberProperty);
}
public void GenerateFile()
{codeDomProvider = new CSharpCodeProvider();
generator = codeDomProvider.CreateGenerator(this.fileName);
codeCompileUnit.Namespaces.Add(codeNamespace);
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(this.fileName,false);
CodeGeneratorOptions generatorOptions = new CodeGeneratorOptions();
generatorOptions.BracingStyle = "C";
generator.GenerateCodeFromCompileUnit(this.codeCompileUnit,streamWriter,generatorOptions);
streamWriter.Close();
}
}
}