/// <summary> /// Create configuration object, which implements given Structure. /// Structure properties are parsed from input stream. /// </summary> /// <param name="parser">Parser which is used for input/output.</param> /// <param name="readFromParser">Determine that values can be read from parser.</param> /// <typeparam name="Structure">Interface which describes structure of configuration file.</typeparam> /// <returns>Configuration object.</returns> private static Structure createConfig <Structure>(ConfigParser parser, bool readFromParser = true) where Structure : IConfiguration { var structureType = typeof(Structure); //throws exception for invalid structureType StructureValidation.ThrowOnInvalid(structureType); var structureInfo = StructureFactory.CreateStructureInfo(structureType); var optionValues = readFromParser ? parser.GetOptionValues(structureInfo) : getDefaults(structureInfo); if (!readFromParser) { //parser has to now about structure parser.RegisterStructure(structureInfo); } var configRoot = ConfigFactory.CreateConfigRoot(structureInfo); configRoot.AssociateParser(parser); //fill config with option values foreach (var value in optionValues) { configRoot.SetOption(value); if (!readFromParser) { //parser doesn't know about default values - notify it var info = configRoot.GetOptionInfo(value.Name); parser.SetOption(info, value); } } return((Structure)(object)configRoot); }