1 /* **************************************************************************** 2 * 3 * Copyright (c) Microsoft Corporation. 4 * 5 * This source code is subject to terms and conditions of the Apache License, Version 2.0. A 6 * copy of the license can be found in the License.html file at the root of this distribution. If 7 * you cannot locate the Apache License, Version 2.0, please send an email to 8 * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound 9 * by the terms of the Apache License, Version 2.0. 10 * 11 * You must not remove this notice, or any other, from this software. 12 * 13 * 14 * ***************************************************************************/ 15 16 using System.Dynamic.Utils; 17 18 namespace System.Dynamic { 19 20 /// <summary> 21 /// Represents the invoke dynamic operation at the call site, providing the binding semantic and the details about the operation. 22 /// </summary> 23 public abstract class InvokeBinder : DynamicMetaObjectBinder { 24 private readonly CallInfo _callInfo; 25 26 /// <summary> 27 /// Initializes a new instance of the <see cref="InvokeBinder" />. 28 /// </summary> 29 /// <param name="callInfo">The signature of the arguments at the call site.</param> InvokeBinder(CallInfo callInfo)30 protected InvokeBinder(CallInfo callInfo) { 31 ContractUtils.RequiresNotNull(callInfo, "callInfo"); 32 _callInfo = callInfo; 33 } 34 35 /// <summary> 36 /// The result type of the operation. 37 /// </summary> 38 public override sealed Type ReturnType { 39 get { return typeof(object); } 40 } 41 42 /// <summary> 43 /// Gets the signature of the arguments at the call site. 44 /// </summary> 45 public CallInfo CallInfo { 46 get { return _callInfo; } 47 } 48 49 /// <summary> 50 /// Performs the binding of the dynamic invoke operation if the target dynamic object cannot bind. 51 /// </summary> 52 /// <param name="target">The target of the dynamic invoke operation.</param> 53 /// <param name="args">The arguments of the dynamic invoke operation.</param> 54 /// <returns>The <see cref="DynamicMetaObject"/> representing the result of the binding.</returns> FallbackInvoke(DynamicMetaObject target, DynamicMetaObject[] args)55 public DynamicMetaObject FallbackInvoke(DynamicMetaObject target, DynamicMetaObject[] args) { 56 return FallbackInvoke(target, args, null); 57 } 58 59 /// <summary> 60 /// Performs the binding of the dynamic invoke operation if the target dynamic object cannot bind. 61 /// </summary> 62 /// <param name="target">The target of the dynamic invoke operation.</param> 63 /// <param name="args">The arguments of the dynamic invoke operation.</param> 64 /// <param name="errorSuggestion">The binding result to use if binding fails, or null.</param> 65 /// <returns>The <see cref="DynamicMetaObject"/> representing the result of the binding.</returns> FallbackInvoke(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion)66 public abstract DynamicMetaObject FallbackInvoke(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion); 67 68 /// <summary> 69 /// Performs the binding of the dynamic invoke operation. 70 /// </summary> 71 /// <param name="target">The target of the dynamic invoke operation.</param> 72 /// <param name="args">An array of arguments of the dynamic invoke operation.</param> 73 /// <returns>The <see cref="DynamicMetaObject"/> representing the result of the binding.</returns> Bind(DynamicMetaObject target, DynamicMetaObject[] args)74 public sealed override DynamicMetaObject Bind(DynamicMetaObject target, DynamicMetaObject[] args) { 75 ContractUtils.RequiresNotNull(target, "target"); 76 ContractUtils.RequiresNotNullItems(args, "args"); 77 78 return target.BindInvoke(this, args); 79 } 80 81 // this is a standard DynamicMetaObjectBinder 82 internal override sealed bool IsStandardBinder { 83 get { 84 return true; 85 } 86 } 87 } 88 } 89