void scriptObjectAction_Execute(object sender, SimpleActionExecuteEventArgs e) { ObjectScriptGenerator creator = new ObjectScriptGenerator(); var result = new ScriptingResult() { Script = creator.GenerateScript(e.SelectedObjects.Cast <object>().ToList()) }; e.ShowViewParameters.CreatedView = Application.CreateDetailView(Application.CreateObjectSpace(result.GetType()), result); }
public string GenerateScript(IList <object> selectedObjects) { CodeCompileUnit compileUnit = new CodeCompileUnit(); CodeNamespace ns = new CodeNamespace(); ns.Name = "ScriptedObjects"; compileUnit.Namespaces.Add(ns); CodeTypeDeclaration typeDeclaration = new CodeTypeDeclaration(); typeDeclaration.Name = "Class1"; ns.Types.Add(typeDeclaration); var method = new CodeMemberMethod(); method.Name = "CreateObject"; typeDeclaration.Members.Add(method); method.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(Session)), "session")); ns.Imports.AddRange(selectedObjects.Select(obj => obj.GetType().Name).Distinct().Select(n => new CodeNamespaceImport(n)).ToArray()); var instanceManager = new InstanceManager(); if (selectedObjects.Count == 1) { var rootObject = selectedObjects[0]; var rootObjectType = rootObject.GetType(); method.ReturnType = new CodeTypeReference(rootObjectType.Name); string resultName = AddObjectInstance(method, rootObject, instanceManager); method.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression(resultName))); } else { foreach (var obj in selectedObjects) { AddObjectInstance(method, obj, instanceManager); } } CSharpCodeProvider codeProvider = new CSharpCodeProvider(); var result = new ScriptingResult(); using (var stringWriter = new StringWriter()) { using (var itw = new IndentedTextWriter(stringWriter)) { var options = new CodeGeneratorOptions(); options.BracingStyle = "C"; codeProvider.GenerateCodeFromCompileUnit(compileUnit, itw, options); } return(stringWriter.ToString()); } }