public object[,] Eval(params object[] inputs) { try { var convertedInputs = new List <object>(); for (var i = 0; i < inputs.Length - _argOffset; i++) { var paramName = _methodInfo.GetParameters()[i].Name; var inputAsMatrix = inputs[i + _argOffset] as object[, ]; if (inputAsMatrix[0, 0] is ExcelMissing && _defaultValues[i] == string.Empty) { throw new ArgumentException($"{paramName}: Is left blank but is not optional."); } convertedInputs.Add(ExcelTypeConverter.ConvertInput(_methodInfo.GetParameters()[i].ParameterType, inputAsMatrix, paramName, _defaultValues[i])); } var output = _methodInfo.Invoke(null, convertedInputs.ToArray()); var outputName = _argOffset == 0 ? null : GetOutputName(inputs[0]); return(ExcelTypeConverter.ConvertOuput(_methodInfo.ReturnType, output, outputName)); } catch (TargetInvocationException e) { var result = new object[1, 1]; if (e.InnerException != null) { result[0, 0] = "ERROR: " + e.InnerException.Message; } else { result[0, 0] = "ERROR: " + e.Message; } return(result); } catch (Exception e) { var result = new object[1, 1]; result[0, 0] = "ERROR: " + e.Message; return(result); } }
public static object[,] ViewObjectPropertyValue( [QuantSAExcelArgument(Description = "The object you wish to view.", Name = "Object")] object objectName, [QuantSAExcelArgument(Description = "The name of the property from the object that you wish to view.")] string propertyName, [QuantSAExcelArgument(Description = "If the property with propertyName is in turn an object then this" + "is the name of the property inside that which you wish to view.", Default = null)] string propertyNameL2) { if (propertyNameL2 != null) { var obj = GetObjectPropertyValue(objectName, propertyName); return(ViewObjectPropertyValue(obj, propertyNameL2, null)); } var output = GetObjectPropertyValue(objectName, propertyName); if (output is ISerializableViaName objWithName) { return(ExcelTypeConverter.ConvertOuput(typeof(string), objWithName.GetName(), propertyName)); } return(ExcelTypeConverter.ConvertOuput(output.GetType(), output, propertyName)); }
/// <summary> /// Get all the functions that appear in the assembly. If the function name appears in /// <paramref name="funcsInUserFile"/> then use the value there to override the default /// visibility. /// </summary> /// <param name="assembly"></param> /// <param name="addInName"></param> /// <param name="funcsInUserFile"></param> /// <param name="delegates"></param> /// <param name="functionAttributes"></param> /// <param name="functionArgumentAttributes"></param> public static void GetDelegatesAndAttributes(Assembly assembly, string addInName, Dictionary <string, bool> funcsInUserFile, ref List <Delegate> delegates, ref List <object> functionAttributes, ref List <List <object> > functionArgumentAttributes) { var types = assembly.GetTypes(); foreach (var type in types) { if (!type.IsPublic) { continue; } foreach (var member in type.GetMembers()) { var excelFuncAttr = member.GetCustomAttribute <QuantSAExcelFunctionAttribute>(); var dnaExcelFuncAttr = member.GetCustomAttribute <ExcelFunctionAttribute>(); if (dnaExcelFuncAttr != null && excelFuncAttr == null) { Log.Warn($"{dnaExcelFuncAttr.Name} is defined as an ExcelDNA function but not a QuantSA function so will be ignored"); } if (excelFuncAttr == null) { continue; } if (funcsInUserFile.ContainsKey(excelFuncAttr.Name)) { excelFuncAttr.IsHidden = !funcsInUserFile[excelFuncAttr.Name]; } var parts = excelFuncAttr.Name.Split('.'); if (!(parts.Length == 2 && parts[0].Equals(addInName))) { throw new AddInException($"{excelFuncAttr.Name} does not following the naming " + $"convention: {addInName}.FunctionName"); } FunctionNames.Add(excelFuncAttr.Name); var method = member as MethodInfo; var aAttr = new List <object>(); var defaults = new List <string>(); if (method == null) { throw new AddInException($"{excelFuncAttr.Name} is marked with a " + "QuantSAExcelFunctionAttribute but is not a method"); } var putOnMap = ExcelTypeConverter.ShouldUseReference(method.ReturnType); if (putOnMap) { aAttr.Add(new ExcelArgumentAttribute { Name = "objectName", Description = "The name that this object will be assigned on the map. " + "Should be unique." }); } foreach (var param in method.GetParameters()) { var argAttrib = param.GetCustomAttribute <QuantSAExcelArgumentAttribute>(); if (argAttrib == null) { var dnaAttrib = param.GetCustomAttribute <ExcelArgumentAttribute>(); if (dnaAttrib != null) { if (dnaAttrib.Name == null) { dnaAttrib.Name = param.Name; } dnaAttrib.Description = "(" + param.ParameterType.Name + ")" + dnaAttrib.Description; aAttr.Add(dnaAttrib); } else { aAttr.Add(new ExcelArgumentAttribute { Name = param.Name, Description = param.ParameterType.Name }); } defaults.Add(string.Empty); } else { if (argAttrib.Name == null) { argAttrib.Name = param.Name; } argAttrib.Description = "(" + param.ParameterType.Name + ")" + argAttrib.Description; aAttr.Add(argAttrib); if (argAttrib.Default != string.Empty) { argAttrib.Description = "*" + argAttrib.Description + $"(Default value = {argAttrib.Default})"; } defaults.Add(argAttrib.Default); } } var dnaFuncAttr = excelFuncAttr; if (dnaFuncAttr.Name == null) { dnaFuncAttr.Name = method.Name; } var excelFunction = new ExcelFunction(method, defaults, putOnMap); delegates.Add(excelFunction.GetDelegate()); functionAttributes.Add(dnaFuncAttr); functionArgumentAttributes.Add(aAttr); } } }