public static Dynamic GetValue(Type type, string memberName, object target) { object result = null; if (type.IsCOMObject) { const BindingFlags flags = BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.GetField | BindingFlags.GetProperty | BindingFlags.OptionalParamBinding; result = type.InvokeMember(memberName, flags, null, target, null); } else { MemberInfo member = GetValueMember(type, memberName); switch (member.MemberType) { case MemberTypes.Field: var field = (FieldInfo)member; result = field.GetValue(target); break; case MemberTypes.Property: var property = (PropertyInfo)member; if (!property.CanRead) { throw new InvalidOperationException(Resources.CannotReadProperty); } result = property.GetValue(target, null); break; } } return(DynamicFactory.CreateDynamic(result)); }
/// <summary> /// Invokes a scripted function from user code. /// </summary> /// <param name="function">The name of the function to be invoked</param> /// <param name="args">Arguments to be passed to the function</param> /// <returns>The value returned by the function itself</returns> public Dynamic Invoke(string function, params object[] args) { var literals = new Expression[args.Length]; for (int i = 0; i < args.Length; ++i) { literals[i] = new Literal(DynamicFactory.CreateDynamic(args[i])); } var call = new FunctionCall(function, literals); RuntimeServices.Interpreter = interpreter; call.AcceptCompiler(interpreter); return(interpreter.ReturnedValue); }
/// <summary> /// Invokes a method from the given object with the given arguments. /// </summary> /// <param name="method">The method's name</param> /// <param name="caller">The object from which to call a method</param> /// <param name="args">The arguments to pass to the method</param> /// <returns>The value returned by the method</returns> public static Dynamic Invoke(string method, Dynamic caller, params object[] args) { Expression callingExpr = new Literal(caller); var literals = new Expression[args.Length]; for (int i = 0; i < args.Length; ++i) { literals[i] = new Literal(DynamicFactory.CreateDynamic(args[i])); } var call = new MethodCall(callingExpr, method, literals); call.AcceptCompiler(Interpreter); return(Interpreter.ReturnedValue); }
/// <summary> /// Invokes a static method with the given arguments. /// </summary> /// <param name="method">The method's name</param> /// <param name="klass">The class from which to call a method</param> /// <param name="args">The arguments to pass to the method</param> /// <returns>The value returned by the method</returns> public static Dynamic Invoke(string method, Class klass, params object[] args) { var name = new QualifiedName(klass.Name, method); var literals = new Expression[args.Length]; for (int i = 0; i < args.Length; ++i) { literals[i] = new Literal(DynamicFactory.CreateDynamic(args[i])); } var call = new StaticMethodCall(name, literals); call.AcceptCompiler(Interpreter); return(Interpreter.ReturnedValue); }