private static MethodInfo RandomMethod(ITaskProvider taskProvider) { var weight = RandomUtility.Next(100) + 1; var methods = taskProvider.GetType().GetMethods(); return(methods.RandomOrDefault((item) => Predicate(item))); bool Predicate(MethodInfo methodInfo) { if (methodInfo.IsStatic == true) { return(false); } if (methodInfo.ReturnType != typeof(void)) { return(false); } var attr = methodInfo.GetCustomAttribute <TaskMethodAttribute>(); if (attr == null) { return(false); } if (attr.Weight < weight) { return(false); } var parameters = methodInfo.GetParameters(); if (parameters.Count() != 2) { return(false); } return(parameters[1].ParameterType == typeof(TaskContext)); } }