private static void RegisterMustashMethods() { MustashMethods = typeof(Faker).GetProperties() .Where(p => p.IsDefined(typeof(RegisterMustasheMethodsAttribute), true)) .SelectMany(p => { return(p.PropertyType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly) .Where(mi => { if (mi.GetParameters().Length == 0 || mi.GetParameters().All(pi => pi.IsOptional)) { if (mi.GetGenericArguments().Length == 0) { return true; } } return false; }) .Select(mi => { var mm = new MustashMethod { Name = string.Format("{0}.{1}", DataSet.ResolveCategory(p.PropertyType), mi.Name).ToUpperInvariant(), Method = mi, OptionalArgs = Enumerable.Repeat(Type.Missing, mi.GetParameters().Length).ToArray() }; return mm; })); }).ToDictionary(mm => mm.Name); }
private static object[] ConvertStringArgumentsToObjects(string[] parameters, MustashMethod mm) { try { return(mm.Method.GetParameters() .Zip(parameters, GetValueForParameter) .ToArray()); } catch (OverflowException ex) { throw new ArgumentOutOfRangeException($"One of the arguments for {mm.Name} is out of supported range. Argument list: {string.Join(",", parameters)}", ex); } catch (Exception ex) when(ex is InvalidCastException || ex is FormatException) { throw new ArgumentException($"One of the arguments for {mm.Name} cannot be converted to target type. Argument list: {string.Join(",", parameters)}", ex); } catch (Exception ex) { throw new ArgumentException($"Cannot parse arguments for {mm.Name}. Argument list: {string.Join(",", parameters)}", ex); } }
public static void RegisterMustashMethods(Type type) { MustashMethods = type.GetProperties() .Where(p => p.IsDefined(typeof(RegisterMustasheMethodsAttribute), true)) .SelectMany(p => { return(p.PropertyType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly) .Where(mi => mi.GetGenericArguments().Length == 0) .Select(mi => { var mm = new MustashMethod { Name = string.Format("{0}.{1}", DataSet.ResolveCategory(p.PropertyType), mi.Name).ToUpperInvariant(), Method = mi, OptionalArgs = mi.GetParameters().Where(pi => pi.IsOptional).Select(_ => Type.Missing).ToArray() }; return mm; })); }) .ToLookup(mm => mm.Name); }