private void Register(Delegate function, bool createAction) { var functionName = function.Method.Name; var returnType = function.Method.ReturnType; var skip = 0; var parameters = function.Method.GetParameters(); if (parameters.Length > 0 && parameters[0].ParameterType == typeof(QueryParameters)) { skip = 1; } var arguments = parameters.Skip(skip).ToDictionary(i => i.Name, i => i.ParameterType); DelegateODataFunction handler = (queryParameters, objects) => { var args = new List <object>(); if (skip == 1) { args.Add(queryParameters); } return(function.DynamicInvoke(args.Concat(objects.Values).ToArray())); }; if (createAction) { Register(new Action(functionName, handler, returnType, arguments)); } else { Register(new Function(functionName, handler, returnType, arguments)); } }
/// <summary> /// Initializes a new instance of the <see cref="Function"/> class. /// </summary> /// <param name="functionName">The name of the function.</param> /// <param name="handler">The handler for the function.</param> /// <param name="returnType">The return type of the function.</param> /// <param name="parametersTypes">The arguments of the function.</param> public Function(string functionName, DelegateODataFunction handler, Type returnType, Dictionary <string, Type> parametersTypes = null) { Contract.Requires <ArgumentNullException>(functionName != null); Contract.Requires <ArgumentException>(functionName != string.Empty); Contract.Requires <ArgumentNullException>(handler != null); Contract.Requires <ArgumentNullException>(returnType != null); Name = functionName; Handler = handler; ReturnType = returnType; if (parametersTypes == null) { parametersTypes = new Dictionary <string, Type>(); } ParametersTypes = parametersTypes; }
/// <inheritdoc /> public Action(string actionName, DelegateODataFunction handler, Dictionary <string, Type> parametersTypes = null) : this(actionName, handler, typeof(void), parametersTypes) { }
/// <inheritdoc /> public Action(string actionName, DelegateODataFunction handler, Type returnType, Dictionary <string, Type> parametersTypes = null) : base(actionName, handler, returnType, parametersTypes) { }