public BindInvokeMember ( |
||
binder | An instance of the |
|
args | An array of |
|
리턴 |
/// <summary> /// Performs the binding of the dynamic invoke member operation. /// </summary> /// <param name="target">The target of the dynamic invoke member operation.</param> /// <param name="args">An array of arguments of the dynamic invoke member operation.</param> /// <returns>The <see cref="DynamicMetaObject"/> representing the result of the binding.</returns> public sealed override DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args) { ContractUtils.RequiresNotNull(target, "target"); ContractUtils.RequiresNotNullItems(args, "args"); return target.BindInvokeMember(this, args); }
public static bool TryBindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject instance, DynamicMetaObject[] args, out DynamicMetaObject result) { ContractUtils.RequiresNotNull(binder, "binder"); ContractUtils.RequiresNotNull(instance, "instance"); ContractUtils.RequiresNotNull(args, "args"); if (TryGetMetaObject(ref instance)) { // // Demand Full Trust to proceed with the binding. // new PermissionSet(PermissionState.Unrestricted).Demand(); result = instance.BindInvokeMember(binder, args); return true; } else { result = null; return false; } }
public static void TestMetaObject(DynamicMetaObject target, string methodName, object[] arguments, bool isExtension = false) { InvokeMemberBinder binder = new TestInvokeMemberBinder(methodName, arguments.Length); DynamicMetaObject[] args = new DynamicMetaObject[arguments.Length]; for (int idx = 0; idx < args.Length; idx++) { object value = arguments[idx]; Type valueType = value != null ? value.GetType() : typeof(object); args[idx] = new DynamicMetaObject(Expression.Parameter(valueType), BindingRestrictions.Empty, value); } DynamicMetaObject result = target.BindInvokeMember(binder, args); Assert.IsNotNull(result); if (isExtension) { UnaryExpression expression = result.Expression as UnaryExpression; Assert.IsNotNull(expression); MethodCallExpression callExpression = expression.Operand as MethodCallExpression; Assert.IsNotNull(callExpression); Assert.IsTrue(callExpression.Method.ToString().Contains(methodName)); } else { Assert.AreSame(target, result.Value); } }
public static void TestBindParams(DynamicMetaObject target) { string methodName = "ToString"; object[] arguments = new object[] { }; InvokeMemberBinder binder = new TestInvokeMemberBinder(methodName, arguments.Length); DynamicMetaObject[] args = new DynamicMetaObject[arguments.Length]; ExceptionTestHelper.ExpectException<ArgumentNullException>(() => { var result = target.BindInvokeMember(null, args); }); ExceptionTestHelper.ExpectException<ArgumentNullException>(() => { var result = target.BindInvokeMember(binder, null); }); }
/// <summary> /// Tries to perform binding of the dynamic invoke member operation. /// </summary> /// <param name="binder">An instance of the <see cref="InvokeMemberBinder"/> that represents the details of the dynamic operation.</param> /// <param name="instance">The target of the dynamic operation. </param> /// <param name="args">An array of <see cref="DynamicMetaObject"/> instances - arguments to the invoke member operation.</param> /// <param name="result">The new <see cref="DynamicMetaObject"/> representing the result of the binding.</param> /// <returns>true if operation was bound successfully; otherwise, false.</returns> public static bool TryBindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject instance, DynamicMetaObject[] args, out DynamicMetaObject result) { ContractUtils.RequiresNotNull(binder, "binder"); ContractUtils.RequiresNotNull(instance, "instance"); ContractUtils.RequiresNotNull(args, "args"); if (TryGetMetaObject(ref instance)) { result = instance.BindInvokeMember(binder, args); return true; } else { result = null; return false; } }
/// <summary> /// Performs the binding of the dynamic operation. /// </summary> /// <param name="target">The target of the dynamic operation.</param> /// <param name="args">An array of arguments of the dynamic operation.</param> /// <returns>The System.Dynamic.DynamicMetaObject representing the result of the binding.</returns> public override DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args) { // When binding a normal message send, we have two options if ((target is SmalltalkDynamicMetaObject) || (this.NativeName == null)) // 1. If dealing with a Smalltalk object, don't do the normal BindInvokeMember and perform our logic directly return base.Bind(target, args); else // 2. For all other objects, ask the object to bing the operation and fallback to ST only if it's not successful. // NB: Maybe we wan't to do binding BEFORE the object, so we can shadow its methods and not vice versa. return target.BindInvokeMember(this.InvokeMemberBinder, args); }
/// <summary> /// Tries to perform binding of the dynamic invoke member operation. /// </summary> /// <param name="binder">An instance of the <see cref="InvokeMemberBinder"/> that represents the details of the dynamic operation.</param> /// <param name="instance">The target of the dynamic operation. </param> /// <param name="args">An array of <see cref="DynamicMetaObject"/> instances - arguments to the invoke member operation.</param> /// <param name="result">The new <see cref="DynamicMetaObject"/> representing the result of the binding.</param> /// <returns>true if operation was bound successfully; otherwise, false.</returns> public static bool TryBindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject instance, DynamicMetaObject[] args, out DynamicMetaObject result) { if (TryGetMetaObject(ref instance)) { result = instance.BindInvokeMember(binder, args); return true; } else { result = null; return false; } }
public sealed override DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args) { ContractUtils.RequiresNotNull(target, "target"); ContractUtils.RequiresNotNullItems <DynamicMetaObject>(args, "args"); return(target.BindInvokeMember(this, args)); }
/// <summary> /// Tries to perform binding of the dynamic invoke member operation. /// </summary> /// <param name="binder">An instance of the <see cref="InvokeMemberBinder"/> that represents the details of the dynamic operation.</param> /// <param name="isSetProperty">True if this is for setting a property, false otherwise..</param> /// <param name="instance">The target of the dynamic operation. </param> /// <param name="args">An array of <see cref="DynamicMetaObject"/> instances - arguments to the invoke member operation.</param> /// <param name="result">The new <see cref="DynamicMetaObject"/> representing the result of the binding.</param> /// <returns>true if operation was bound successfully; otherwise, false.</returns> public static bool TryBindInvokeMember(InvokeMemberBinder binder, bool isSetProperty, DynamicMetaObject instance, DynamicMetaObject[] args, out DynamicMetaObject result) { if (TryGetMetaObject(ref instance)) { var comInvokeMember = new ComInvokeMemberBinder(binder, isSetProperty); result = instance.BindInvokeMember(comInvokeMember, args); BindingRestrictions argRestrictions = args.Aggregate( BindingRestrictions.Empty, (current, arg) => current.Merge(arg.PSGetMethodArgumentRestriction())); var newRestrictions = result.Restrictions.Merge(argRestrictions); if (result.Expression.Type.IsValueType) { result = new DynamicMetaObject( Expression.Convert(result.Expression, typeof(object)), newRestrictions ); } else { result = new DynamicMetaObject(result.Expression, newRestrictions); } return true; } else { result = null; return false; } }