Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ Bind() [3/3]

override Expression System.Dynamic.DynamicMetaObjectBinder.Bind ( object[] args,
ReadOnlyCollection< ParameterExpression > parameters,
LabelTarget returnLabel )
inlinesealedinherited

Definition at line 15 of file DynamicMetaObjectBinder.cs.

16 {
17 ContractUtils.RequiresNotNull(args, "args");
18 ContractUtils.RequiresNotNull(parameters, "parameters");
19 ContractUtils.RequiresNotNull(returnLabel, "returnLabel");
20 if (args.Length == 0)
21 {
22 throw Error.OutOfRange("args.Length", 1);
23 }
24 if (parameters.Count == 0)
25 {
26 throw Error.OutOfRange("parameters.Count", 1);
27 }
28 if (args.Length != parameters.Count)
29 {
30 throw new ArgumentOutOfRangeException("args");
31 }
32 Type type;
34 {
36 if (returnLabel.Type != typeof(void) && !TypeUtils.AreReferenceAssignable(returnLabel.Type, type))
37 {
38 throw Error.BinderNotCompatibleWithCallSite(type, this, returnLabel.Type);
39 }
40 }
41 else
42 {
43 type = returnLabel.Type;
44 }
45 DynamicMetaObject dynamicMetaObject = DynamicMetaObject.Create(args[0], parameters[0]);
46 DynamicMetaObject[] args2 = CreateArgumentMetaObjects(args, parameters);
47 DynamicMetaObject dynamicMetaObject2 = Bind(dynamicMetaObject, args2);
48 if (dynamicMetaObject2 == null)
49 {
51 }
52 Expression expression = dynamicMetaObject2.Expression;
53 BindingRestrictions restrictions = dynamicMetaObject2.Restrictions;
54 if (type != typeof(void) && !TypeUtils.AreReferenceAssignable(type, expression.Type))
55 {
56 if (dynamicMetaObject.Value is IDynamicMetaObjectProvider)
57 {
58 throw Error.DynamicObjectResultNotAssignable(expression.Type, dynamicMetaObject.Value.GetType(), this, type);
59 }
60 throw Error.DynamicBinderResultNotAssignable(expression.Type, this, type);
61 }
62 if (IsStandardBinder && args[0] is IDynamicMetaObjectProvider && restrictions == BindingRestrictions.Empty)
63 {
64 throw Error.DynamicBindingNeedsRestrictions(dynamicMetaObject.Value.GetType(), this);
65 }
66 if (expression.NodeType != ExpressionType.Goto)
67 {
68 expression = Expression.Return(returnLabel, expression);
69 }
70 if (restrictions != BindingRestrictions.Empty)
71 {
72 expression = Expression.IfThen(restrictions.ToExpression(), expression);
73 }
74 return expression;
75 }
static DynamicMetaObject[] CreateArgumentMetaObjects(object[] args, ReadOnlyCollection< ParameterExpression > parameters)
override Expression Bind(object[] args, ReadOnlyCollection< ParameterExpression > parameters, LabelTarget returnLabel)
static void RequiresNotNull(object value, string paramName)
static bool AreReferenceAssignable(Type dest, Type src)
Definition TypeUtils.cs:673
static Exception OutOfRange(string paramName, object p1)
Definition Error.cs:708
static Exception DynamicObjectResultNotAssignable(object p0, object p1, object p2, object p3)
Definition Error.cs:63
static Exception DynamicBindingNeedsRestrictions(object p0, object p1)
Definition Error.cs:58
static Exception BinderNotCompatibleWithCallSite(object p0, object p1, object p2)
Definition Error.cs:53
static Exception BindingCannotBeNull()
Definition Error.cs:73
static Exception DynamicBinderResultNotAssignable(object p0, object p1, object p2)
Definition Error.cs:68
static GotoExpression Return(LabelTarget target)
Expression(ExpressionType nodeType, Type type)
virtual ExpressionType NodeType
static ConditionalExpression IfThen(Expression test, Expression ifTrue)
static ? Type GetType(string typeName, bool throwOnError, bool ignoreCase)
Definition Type.cs:408

References System.Dynamic.Utils.TypeUtils.AreReferenceAssignable(), System.Dynamic.DynamicMetaObjectBinder.Bind(), System.Linq.Expressions.Error.BinderNotCompatibleWithCallSite(), System.Linq.Expressions.Error.BindingCannotBeNull(), System.Collections.ObjectModel.ReadOnlyCollection< T >.Count, System.Dynamic.DynamicMetaObject.Create(), System.Dynamic.DynamicMetaObjectBinder.CreateArgumentMetaObjects(), System.Linq.Expressions.Error.DynamicBinderResultNotAssignable(), System.Linq.Expressions.Error.DynamicBindingNeedsRestrictions(), System.Linq.Expressions.Error.DynamicObjectResultNotAssignable(), System.Dynamic.BindingRestrictions.Empty, System.Dynamic.DynamicMetaObject.Expression, System.Linq.Expressions.Expression< TDelegate >.IfThen(), System.Dynamic.DynamicMetaObjectBinder.IsStandardBinder, System.Linq.Expressions.Expression< TDelegate >.NodeType, System.Linq.Expressions.Error.OutOfRange(), System.Dynamic.Utils.ContractUtils.RequiresNotNull(), System.Dynamic.DynamicMetaObject.Restrictions, System.Linq.Expressions.Expression< TDelegate >.Return(), System.Dynamic.DynamicMetaObjectBinder.ReturnType, System.Dynamic.BindingRestrictions.ToExpression(), System.Linq.Expressions.Expression< TDelegate >.Type, System.Linq.Expressions.LabelTarget.Type, System.type, and System.Dynamic.DynamicMetaObject.Value.

Referenced by System.Dynamic.DynamicMetaObjectBinder.Bind().