2015-04-09 6 views
0

Я генерируя-структуру, используя CodeDomКак предотвратить CodeMemberField от вставки новой строки?

var type = new CodeTypeDeclaration(); 
type.Name = "MyStructure"; 
type.IsStruct = true; 
type.TypeAttributes = TypeAttributes.Public; 
type.Members. 

type.Members.Add(new CodeMemberField{ 
    Attributes = System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Const, 
    Name = "CreatedBy", 
    Type = new CodeTypeReference(typeof (String)), 
    InitExpression = new CodePrimitiveExpression("createdby"), 
}); 

type.Members.Add(new CodeMemberField{ 
    Attributes = System.CodeDom.MemberAttributes.Public | System.CodeDom.MemberAttributes.Const, 
    Name = "ModifiedBy", 
    Type = new CodeTypeReference(typeof (String)), 
    InitExpression = new CodePrimitiveExpression("modifiedby") 
}); 

И когда он генерирует это выглядит следующим образом:

public struct MyStructure 
{ 

    public const string CreatedBy = "createdby"; 

    public const string ModifiedBy = "modifiedby"; 
} 

Но я бы предпочел, чтобы не иметь новых строк в нем:

public struct MyStructure 
{ 
    public const string CreatedBy = "createdby"; 
    public const string ModifiedBy = "modifiedby"; 
} 

Возможно ли, чтобы генерация не включала новые строки?

+0

Заканчивать http://stackoverflow.com/questions/238002/replace-line-breaks-in-a-string-c-sharp для примера программно удаления новой строки в строке. – calmond

+0

@calmond Мне нужно будет предоставить CodeDom Generate File, затем прочитать файл, а затем удалить только новые строки, которые я хочу удалить, записать файл обратно на диск. Не то, что будет работать очень хорошо ... – Daryl

ответ

0

Обнаружил, что CodeGeneratorOptions позволяет вам указывать NoLineBreaksBetweenMembers. Я не хочу, чтобы применить его ко всему, но я могу создать только мое-структуру, а затем добавить его в качестве CodeSnippetTypeMember:

type.Members.Insert(0, GenerateTypeWithoutEmptyLines(@struct)); 

...

/// <summary> 
/// Removes the blank lines spaces by generating the code as a string without BlankLinesBetweenMembers 
/// </summary> 
/// <param name="type">The type.</param> 
/// <returns></returns> 
private static CodeSnippetTypeMember GenerateTypeWithoutEmptyLines(CodeTypeDeclaration type) 
{ 
    var provider = CodeDomProvider.CreateProvider("CSharp"); 
    using (var sourceWriter = new StringWriter()) 
    using (var tabbedWriter = new IndentedTextWriter(sourceWriter, "\t")) 
    { 
     tabbedWriter.Indent = 2; 
     provider.GenerateCodeFromType(type, tabbedWriter, new CodeGeneratorOptions() 
     { 
      BracingStyle = "C", 
      IndentString = "\t", 
      BlankLinesBetweenMembers = false 
     }); 
     return new CodeSnippetTypeMember("\t\t" + sourceWriter); 
    } 
} 
0

Там также хороший пакет NuGet для генерации кода C#. Возможно, это соответствует вашим требованиям. Это просто идея, потому что, на мой взгляд, удаление пустых лотков в результирующей строке вашего объекта codedom - это взломать.

http://www.codeproject.com/Articles/892114/WuffProjects-CodeGeneration

+0

Я использую инструмент, который принимает только плагины, которые работают с CodeDom, поэтому ваше предложение не будет работать. – Daryl