public O FindOperator <O>(object[] parameters) where O : class { var operationType = typeof(O).Name; var operationName = operationType.Substring(0, operationType.IndexOf("Operator")); for (var priority = operators.Count - 1; priority >= 0; priority--) { for (var i = operators[priority].Count - 1; i >= 0; i--) { var anOperator = operators[priority][i]; anOperator.Processor = Processor; var candidate = anOperator as O; if (candidate == null) { continue; } var member = RuntimeType.FindDirectInstance(candidate, new IdentifierName("Can" + operationName), parameters.Length); if (!member.Invoke(parameters).GetValue <bool>()) { continue; } return(candidate); } } throw new ApplicationException(string.Format("No default for {0}", typeof(O).Name)); }
public TypedValue Operate <O>(params object[] parameters) where O : class { var operationType = typeof(O).Name; var operationName = operationType.Substring(0, operationType.IndexOf("Operator")); var logging = new OperationLogging(Configuration); try { logging.Start(operationName); logging.LogParameters(parameters); var candidate = Operators.FindOperator <O>(parameters); var member = RuntimeType.FindDirectInstance(candidate, new IdentifierName(operationName), parameters.Length); var result = member.Invoke(parameters).GetValue <TypedValue>(); logging.LogResult(candidate, result); return(result); } finally { logging.End(); } }