public static IParser <T> CastParser <T>(this object parser) { var parserType = parser.GetType(); var nameGetter = DynamicProperty.GetProperty(parserType, nameof(Parser <object> .Name)); var tryParseMethod = parserType.GetMethod(nameof(Parser <object> .TryParse)); var tryParse = DynamicMethod.GetMethod(tryParseMethod); var parseResult = tryParseMethod.ReturnType; var isSuccess = DynamicMethod.GetMethod(parseResult, nameof(IParseResult <object> .IsSuccess)); var errorGetter = DynamicProperty.GetProperty(parseResult, nameof(IParseResult <object> .Error)); var resultGetter = DynamicProperty.GetProperty(parseResult, nameof(IParseResult <object> .Result)); var name = (string)nameGetter(parser); return(new Parser <T>(name, inp => { var parsed = tryParse(parser, new object[] { inp }); if (!(bool)isSuccess(parsed, new object[0])) { var error = (ParseError)errorGetter(parsed); return Parse.Error <T>(error); } var result = resultGetter(parsed); return Parse.Success <T>(result); })); }