using System.Collections.Generic;
public class DocumentMetadata
public DateTime DateOfBirth { get; set; }
public Gender Gender { get; set; }
public string RefNum { get; set; }
public override string ToString()
return string.Format("DocumentMetadata: DOB={0:yyyy-MM-dd}, Gender={1}, RefNum={2}", DateOfBirth, Gender, RefNum);
public delegate bool Parser(string line, DocumentMetadata dto);
public interface IDocumentParser
DocumentMetadata Parse(IEnumerable<string> input);
public abstract class BaseParser : IDocumentParser
protected abstract List<Parser> GetParsers();
public virtual DocumentMetadata Parse(IEnumerable<string> input)
var parsers = this.GetParsers();
var instance = new DocumentMetadata();
var successCount = input.Sum( line => parsers.Count( parser => parser(line, instance) ));
Console.WriteLine("{0} lines successfully parsed.", successCount);
public class DocumentParser : BaseParser
protected override List<Parser> GetParsers()
private bool ParseDateOfBirth(string line, DocumentMetadata dto)
if (!line.StartsWith("DOB:")) return false;
dto.DateOfBirth = DateTime.Parse(line.Substring(4));
private bool ParseGender(string line, DocumentMetadata dto)
if (!line.StartsWith("Sex:")) return false;
var s = line.Substring(4,1);
dto.Gender = Gender.Male;
dto.Gender = Gender.Female;
private bool ParseRefNum(string line, DocumentMetadata dto)
if (!line.StartsWith("RefNum:")) return false;
dto.RefNum = line.Substring(7);
protected readonly IDocumentParser _parser;
public Application(IDocumentParser parser)
var result = _parser.Parse(input);
Console.WriteLine(result);
public static void Main()
var application = new Application(new DocumentParser());