private void _setFlag(CommandContext context, CompilerFlags flags, Expression <Func <CompilerFlags, object> > prop, string switchName) { Switch s; if ((s = context.GetSwitch(switchName)) != null) { s.AssertValue(); var lambda = prop as LambdaExpression; var memberExpr = lambda.Body as MemberExpression; if (memberExpr == null) { throw new InvalidOperationException(); } var propName = memberExpr.Member.Name; var propInfo = flags.GetType().GetProperty(propName); if (propInfo.PropertyType == typeof(bool)) { StatementHelpers.TryParseBooleanFromString(s.Value, out var value); propInfo.SetValue(flags, value); } else { propInfo.SetValue(flags, Convert.ChangeType(s.Value, propInfo.PropertyType)); } } }