public override Expression Property(Expression target, string name, SourceInfo sourceInfo) { if (IsConstantType(target)) { //TODO: if null, log (or error in strict mode) return(_memberResolver.MemberExpression(name, target.Type, target, Reflection.MemberAccessMode.Read) ?? Constants.NullExpression); } return(base.Property(target, name, sourceInfo)); }
public override DynamicMetaObject FallbackSetMember(DynamicMetaObject target, DynamicMetaObject value, DynamicMetaObject errorSuggestion) { if (target == null) { throw new ArgumentNullException(nameof(target)); } if (value == null) { throw new ArgumentNullException(nameof(target)); } if (!target.HasValue || !value.HasValue) { return(Defer(target, value)); } if (target.Value == null) { return(BinderHelper.NullTargetResult(target, errorSuggestion)); } if (value.Value == null) { return(BinderHelper.SetNullValue(this, value)); } var memberAccess = _memberResolver.MemberExpression(Name, target, MemberAccessMode.Write); var restrictions = BinderHelper.CreateCommonRestrictions(target); if (memberAccess == null || !memberAccess.Type.IsAssignableFrom(value.RuntimeType)) { BindingEventSource.Log.SetMemberResolutionFailure(Name, target.RuntimeType.FullName, value.RuntimeType.FullName); return(BinderHelper.UnresolveableResult(restrictions, errorSuggestion)); } var result = VelocityExpressions.BoxIfNeeded( Expression.Assign( memberAccess, VelocityExpressions.ConvertIfNeeded(value, memberAccess.Type) ) ); return(new DynamicMetaObject(result, restrictions)); }
public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion) { if (target == null) { throw new ArgumentNullException(nameof(target)); } if (!target.HasValue) { return(Defer(target)); } if (target.Value == null) { return(BinderHelper.NullTargetResult(target, errorSuggestion)); } Expression result = null; var restrictions = BinderHelper.CreateCommonRestrictions(target); try { result = _memberResolver.MemberExpression(Name, target, MemberAccessMode.Read); } catch (AmbiguousMatchException) { BindingEventSource.Log.GetMemberResolutionAmbiguous(Name, target.RuntimeType.FullName); return(BinderHelper.UnresolveableResult(restrictions, errorSuggestion)); } if (result == null) { BindingEventSource.Log.GetMemberResolutionFailure(Name, target.RuntimeType.FullName); return(BinderHelper.UnresolveableResult(restrictions, errorSuggestion)); } return(new DynamicMetaObject( VelocityExpressions.ConvertIfNeeded(result, ReturnType), restrictions )); }