作为我一直在努力的代码生成框架的一部分,我已经成功地将包含构造函数,方法,属性和字段的类生成到每个类的文件中。我创建了一个建模工具,可以用来捕获业务领域。模型中的元数据是驱动代码生成过程的因素。
目前,每次运行生成器时,我都会覆盖每个类文件,替换生成的c#类文件的内容。
现在而不是覆盖,我想检查成员是否已存在于具有相同参数签名的现有类中,如果找到,则不会将该成员添加到类中。
例如,如果我改变了方法的参数列表或返回类型,那么我会将那个方法添加到现有的类中。
任何更改都将添加到现有类中,并保存到文件中。
通过这种方式,如果我在生成过程之外编辑类,则在重新生成类时不会丢失那些更改。
下面的代码段显示了一个示例,该示例说明了在现有文件(如果存在)或从新文件生成类的情况下从哪里创建编译单元的示例。
我正在寻找一些不错的Roslyn代码示例,这些示例说明如何枚举给定的编译单元,并检查是否存在成员名称和参数签名。
// Create Properties within class
var propertyList = RoslynUtilities.GetPropertiesList(props.OrderBy(m=>m.Name).ToList());
// Check if class has already been generated
if (FileOperations.FileExists(targetSourceFilePath))
{
// Create CompilationUnit from exsiting file
var file = FileOperations.ReadModelFile(targetSourceFilePath);
compUnit = RoslynQuoter.Quoter.Parse(file, RoslynQuoter.NodeKind.CompilationUnit) as CompilationUnitSyntax;
// Sample code to enumerate members..
var members = compUnit.SyntaxTree.GetRoot().DescendantNodes().OfType<MemberDeclarationSyntax>();
foreach (var member in members)
{
var property = member as PropertyDeclarationSyntax;
if (property != null)
Console.WriteLine("Property: " + property.Identifier);
var method = member as MethodDeclarationSyntax;
if (method != null)
Console.WriteLine("Method: " + method.Identifier);
}
}
else
{
// Create Class
{
compUnit = SyntaxFactory.CompilationUnit()
.WithMembers(SyntaxFactory.SingletonList<MemberDeclarationSyntax>(RoslynUtilities
.GetNameSpace(classNameSpace)
.WithMembers(SyntaxFactory.SingletonList<MemberDeclarationSyntax>(SyntaxFactory
.ClassDeclaration(className)
.WithModifiers(SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PublicKeyword),
SyntaxFactory.Token(SyntaxKind.PartialKeyword)))
.WithBaseList(SyntaxFactory.BaseList(SyntaxFactory.SeparatedList<BaseTypeSyntax>(
GetBaseListTypes(domainContext))))))))
.NormalizeWhitespace();
}
}