public ProgramElement Convert() { Contract.Ensures(Contract.Result <ProgramElement>() != null, "ConverterFromHitToProgramElement:ReadProgramElementFromDocument - an object must be returned from this method!"); //Get standard field values string name = luceneDocument.GetField(SandoField.Name.ToString()).StringValue().ToSandoDisplayable(); ProgramElementType type = (ProgramElementType)Enum.Parse(typeof(ProgramElementType), luceneDocument.GetField(SandoField.ProgramElementType.ToString()).StringValue(), true); string fullFilePath = luceneDocument.GetField(SandoField.FullFilePath.ToString()).StringValue(); int definitionLineNumber = int.Parse(luceneDocument.GetField(SandoField.DefinitionLineNumber.ToString()).StringValue()); int definitionColumnNumber = int.Parse(luceneDocument.GetField(SandoField.DefinitionColumnNumber.ToString()).StringValue()); string snippet = luceneDocument.GetField(SandoField.Source.ToString()).StringValue(); //Add values that vary according to element type (e.g., a textline doesn't have a parent class whereas a method often does) //Note: Parameters must match the parameter list for corresponding program element. See MethodDocument.GetParametersForConstructor and the MethodElement constructor var parameters = sandoDocument.GetParametersForConstructor(name, type, fullFilePath, definitionLineNumber, definitionColumnNumber, snippet, luceneDocument); //Create type from the collected values var myClassType = GetMyType(luceneDocument); var myElement = Activator.CreateInstance(myClassType, parameters); //Populate any custom fields from user-defined types, only happens when a third party extends Sando SetCustomFields(myElement, luceneDocument); return(myElement as ProgramElement); }