public static ProjectDto FromModelToDto(ProjectModel model)
 {
     var dto = new ProjectDto();
     dto.OwnerUserId = model.OwnerUserId;
     CopyIProjectItemModelMembers(dto, model);
     CopyProjectContainerItemsFromModelToDto(dto, model);
     return dto;
 }
 public static ProjectModel FromDtoToModel(ProjectDto dto)
 {
     var model = new ProjectModel();
     model.OwnerUserId = dto.OwnerUserId;
     CopyIProjectItemModelMembers(model, dto);
     CopyProjectContainerItemsFromDtoToModel(model, dto);
     return model;
 }
        public static void IntegrateFileModel(ProjectModel projectModel, ProjectFileModel fileModel)
        {
            // Parse C# code file => SyntaxTree
            // NOTE:  The NRefactory Test project uses a somewhat "cleaner"/more "sanitized" version of the 
            // file content for creating the AST.  Why?  I can't be certain, but I suspect that this is to 
            // simplify testing by eliminating stuff that contribute to errors... but maybe there's something 
            // more to it.  Doing some more routine tests on our end should prove whether omitting this step 
            // actually makes any difference.
            fileModel.Parser = new CSharpParser();
            fileModel.SyntaxTree = fileModel.Parser.Parse(fileModel.Content, fileModel.Name);
            fileModel.SyntaxTree.Freeze();
            
            // Convert syntax tree into parsed file that can be stored in the type system.
            fileModel.UnresolvedFile = fileModel.SyntaxTree.ToTypeSystem();

            // Add specified file to the project content.  
            // If a file with the same name already exists, this will update the existing file.
            projectModel.ProjectContent = projectModel.ProjectContent.AddOrUpdateFiles(fileModel.UnresolvedFile);
        }