/// <summary> /// Returns the specified operation. /// </summary> /// <param name="method">The method.</param> /// <param name="parameters">The parameters.</param> /// <param name="source">The source.</param> /// <param name="target">The target.</param> /// <returns>The operation of the specified method.</returns> /// <exception cref="System.ArgumentNullException"> /// The method is null. /// or /// The source is null. /// or /// The method requires parameters which are not specified. /// </exception> /// <exception cref="System.ArgumentException"> /// The specified source type is not supported by the method. /// or /// The specified method is not available. /// or /// The parameters do not contain a required parameter value. /// or /// The type of a parameter does not match the type specified by the method. /// or /// The value of a parameter is not within the expected range. /// or /// The specified source and result are the same objects, but the method does not support in-place operations. /// </exception> public IOperation GetOperation(OperationMethod method, IDictionary <OperationParameter, Object> parameters, Object source, Object target) { if (method == null) { throw new ArgumentNullException("method", "The method is null."); } if (source == null) { throw new ArgumentNullException("source", "The source is null."); } if (source.GetType().Equals(method.SourceType) && !source.GetType().IsSubclassOf(method.SourceType) && !source.GetType().GetInterfaces().Contains(method.SourceType)) { throw new ArgumentException("The specified source type is not supported by the method.", "source"); } Type operationType; if (!_operations.TryGetValue(method, out operationType)) { throw new ArgumentException("The specified method is not available.", "method"); } return(Activator.CreateInstance(operationType, source, target, parameters) as IOperation); }
/// <summary> /// Executes the specified operation. /// </summary> /// <param name="method">The operation method.</param> /// <param name="parameters">The parameters.</param> /// <param name="source">The source.</param> /// <param name="target">The target.</param> /// <returns>The result of the operation.</returns> /// <exception cref="System.ArgumentNullException"> /// The method is null. /// or /// The source is null. /// </exception> /// <exception cref="System.ArgumentException"> /// The specified source type is not supported by the method. /// or /// The specified method is not available. /// </exception> public void ExecuteOperation(OperationMethod method, IDictionary <OperationParameter, Object> parameters, Object source, Object target) { IOperation operation = GetOperation(method, parameters, source, target); operation.Execute(); }
/// <summary> /// Returns the specified operation. /// </summary> /// <param name="method">The method.</param> /// <param name="parameters">The parameters.</param> /// <param name="source">The source.</param> /// <returns>The operation of the specified method.</returns> /// <exception cref="System.ArgumentNullException"> /// The method is null. /// or /// The source is null. /// or /// The method requires parameters which are not specified. /// </exception> /// <exception cref="System.ArgumentException"> /// The specified source type is not supported by the method. /// or /// The specified method is not available. /// or /// The parameters do not contain a required parameter value. /// or /// The type of a parameter does not match the type specified by the method. /// or /// The value of a parameter is not within the expected range. /// </exception> public IOperation GetOperation(OperationMethod method, IDictionary <OperationParameter, Object> parameters, Object source) { return(GetOperation(method, parameters, source, null)); }
/// <summary> /// Initializes a new instance of the <see cref="Operation{SourceType, ResultType}" /> class. /// </summary> /// <param name="source">The source.</param> /// <param name="target">The target.</param> /// <param name="method">The method.</param> /// <param name="parameters">The parameters.</param> /// <exception cref="System.ArgumentNullException"> /// The source is null. /// or /// The method is null. /// or /// The method requires parameters which are not specified. /// </exception> /// <exception cref="System.ArgumentException"> /// The source is invalid. /// or /// The target is invalid. /// or /// The specified source and result are the same objects, but the method does not support in-place operations. /// or /// The parameters do not contain a required parameter value. /// or /// The type of a parameter does not match the type specified by the method. /// or /// A parameter value does not satisfy the conditions of the parameter. /// </exception> protected Operation(SourceType source, ResultType target, OperationMethod method, IDictionary <OperationParameter, Object> parameters) { if (source == null) { throw new ArgumentNullException("source", "The source is null."); } if (method == null) { throw new ArgumentNullException("method", "The method is null."); } if (target != null && ReferenceEquals(source, target) && method.SupportedModes.Contains(ExecutionMode.InPlace)) { throw new ArgumentException("The specified source and result are the same objects, but the method does not support in-place operations.", "target"); } if (parameters == null && method.Parameters != null && method.Parameters.Any(parameter => !parameter.IsOptional)) { throw new ArgumentNullException("parameters", "The method requires parameters which are not specified."); } if (parameters != null && method.Parameters != null) { foreach (OperationParameter parameter in method.Parameters) { // check parameter existence if (!parameter.IsOptional && (!parameters.ContainsKey(parameter) || parameters[parameter] == null)) { throw new ArgumentException("The parameters do not contain a required parameter value (" + parameter.Name + ").", "parameters"); } if (parameters.ContainsKey(parameter) && parameters[parameter] != null) { // check parameter type if (!(parameter.Type.GetInterfaces().Contains(typeof(IConvertible)) && parameters[parameter] is IConvertible) && !parameter.Type.Equals(parameters[parameter].GetType()) && !parameters[parameter].GetType().IsSubclassOf(parameter.Type) && !parameters[parameter].GetType().GetInterfaces().Contains(parameter.Type)) { throw new ArgumentException("The type of a parameter value (" + parameter.Name + ") does not match the type specified by the method.", "parameters"); } // check parameter value if (!parameter.IsValid(parameters[parameter])) { throw new ArgumentException("A parameter value (" + parameter.Name + ") does not satisfy the conditions of the parameter.", "parameters"); } } } } _source = source; _result = target; _method = method; if (parameters != null) { _parameters = new Dictionary <OperationParameter, Object>(parameters); } else { _parameters = new Dictionary <OperationParameter, Object>(); } _state = OperationState.Initialized; }