/// <summary> /// Read a sequence choice, relies on validation rules on the parsing to ensure parsing /// </summary> /// <remarks>The reader must be seekable</remarks> /// <param name="reader"></param> /// <param name="types"></param> /// <returns></returns> protected IStreamTypeParser RSC(DataReader reader, params Type[] types) { if (!reader.GetStream().CanSeek) { throw new ArgumentException(Properties.Resources.BaseParser_RSCStreamCannotSeek, "reader"); } foreach (Type t in types) { long currPos = reader.GetStream().Position; long currentRead = reader.ByteCount; try { IStreamTypeParser ret = (IStreamTypeParser)Activator.CreateInstance(t); ret.FromStream(reader, CS(), _logger); return(ret); } catch (Exception) { } reader.GetStream().Position = currPos; reader.ByteCount = currentRead; } throw new ArgumentException(String.Format(Properties.Resources.BaseParser_NoValidSequenceChoice, this.GetType().Name)); }
/// <summary> /// Read sequence choice, no fallback /// </summary> /// <param name="value">The value of the selected field</param> /// <param name="args">The arguments, should be laid out as 'expr', type, ... </param> /// <returns>The parsed sequence, null if not found a match</returns> protected IStreamTypeParser RSC(DataReader reader, object value, params object[] args) { for (int i = 0; i < args.Length; i += 2) { if (value != null ? Check(args[i].ToString(), value) : Check(args[i].ToString())) { IStreamTypeParser ret = (IStreamTypeParser)Activator.CreateInstance((Type)args[i + 1]); ret.FromStream(reader, CS(), _logger); return(ret); } } throw new ArgumentException(String.Format(Properties.Resources.BaseParser_NoValidSequenceChoice, this.GetType().Name)); }