public static ToObject ( |
||
span | ||
value | object | |
destinationType | ||
리턴 | object |
private object Calculate(ScriptBinaryOperator op, object leftValue, Type leftType, object rightValue, Type rightType) { var customType = leftValue as IScriptCustomType ?? rightValue as IScriptCustomType; if (customType != null) { return(customType.EvaluateBinaryExpression(this, leftValue, rightValue)); } // The order matters: double, float, long, int if (leftType == typeof(double)) { var rightDouble = (double)ScriptValueConverter.ToObject(Span, rightValue, typeof(double)); return(Calculate(op, (double)leftValue, rightDouble)); } if (rightType == typeof(double)) { var leftDouble = (double)ScriptValueConverter.ToObject(Span, leftValue, typeof(double)); return(Calculate(op, leftDouble, (double)rightValue)); } if (leftType == typeof(float)) { var rightFloat = (float)ScriptValueConverter.ToObject(Span, rightValue, typeof(float)); return(Calculate(op, (float)leftValue, rightFloat)); } if (rightType == typeof(float)) { var leftFloat = (float)ScriptValueConverter.ToObject(Span, leftValue, typeof(float)); return(Calculate(op, leftFloat, (float)rightValue)); } if (leftType == typeof(long)) { var rightLong = (long)ScriptValueConverter.ToObject(Span, rightValue, typeof(long)); return(Calculate(op, (long)leftValue, rightLong)); } if (rightType == typeof(long)) { var leftLong = (long)ScriptValueConverter.ToObject(Span, leftValue, typeof(long)); return(Calculate(op, leftLong, (long)rightValue)); } if (leftType == typeof(int) || (leftType != null && leftType.GetTypeInfo().IsEnum)) { var rightInt = (int)ScriptValueConverter.ToObject(Span, rightValue, typeof(int)); return(Calculate(op, (int)leftValue, rightInt)); } if (rightType == typeof(int) || (rightType != null && rightType.GetTypeInfo().IsEnum)) { var leftInt = (int)ScriptValueConverter.ToObject(Span, leftValue, typeof(int)); return(Calculate(op, leftInt, (int)rightValue)); } throw new ScriptRuntimeException(Span, $"Unsupported types [{leftValue ?? "null"}/{leftType?.ToString() ?? "null"}] {op.ToText()} [{rightValue ?? "null"}/{rightType?.ToString() ?? "null"}] for binary operation"); }
public object Evaluate(TemplateContext context, ScriptNode callerContext, ScriptArray parameters, ScriptBlockStatement blockStatement) { // Check parameters if ((hasObjectParams && parameters.Count < parametersInfo.Length - 1) || (!hasObjectParams && parameters.Count != parametersInfo.Length)) { throw new ScriptRuntimeException(callerContext.Span, $"Invalid number of arguments passed [{parameters.Count}] while expecting [{parametersInfo.Length}] for [{callerContext}]"); } // Convert arguments var arguments = new object[parametersInfo.Length]; object[] paramArguments = null; if (hasObjectParams) { paramArguments = new object[parameters.Count - lastParamsIndex]; arguments[lastParamsIndex] = paramArguments; } for (int i = 0; i < parameters.Count; i++) { var destType = hasObjectParams && i >= lastParamsIndex ? typeof(object) : parametersInfo[i].ParameterType; try { var argValue = ScriptValueConverter.ToObject(callerContext.Span, parameters[i], destType); if (hasObjectParams && i >= lastParamsIndex) { paramArguments[i - lastParamsIndex] = argValue; } else { arguments[i] = argValue; } } catch (Exception exception) { throw new ScriptRuntimeException(callerContext.Span, $"Unable to convert parameter #{i} of type [{parameters[i]?.GetType()}] to type [{destType}]", exception); } } // Call method try { var result = method.Invoke(target, arguments); return(result); } catch (Exception exception) { throw new ScriptRuntimeException(callerContext.Span, $"Unexpected exception when calling {callerContext}", exception); } }
private TKey TransformToKey(string member) { return((TKey)ScriptValueConverter.ToObject(new SourceSpan(), member, typeof(TKey))); }