#if NET20 || NET30 || !NET_4_6 // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System.Dynamic.Utils; using System.Reflection; namespace System.Linq.Expressions.Reimplement { /// /// Represents assignment to a member of an object. /// public sealed class MemberAssignment : MemberBinding { private readonly Expression _expression; internal MemberAssignment(MemberInfo member, Expression expression) #pragma warning disable CS0618 // El tipo o el miembro est醤 obsoletos : base(MemberBindingType.Assignment, member) #pragma warning restore CS0618 // El tipo o el miembro est醤 obsoletos { _expression = expression; } /// /// Gets the which represents the object whose member is being assigned to. /// public Expression Expression { get { return _expression; } } /// /// Creates a new expression that is like this one, but using the /// supplied children. If all of the children are the same, it will /// return this expression. /// /// The property of the result. /// This expression if no children changed, or an expression with the updated children. public MemberAssignment Update(Expression expression) { if (expression == Expression) { return this; } return Expression.Bind(Member, expression); } } public partial class Expression { /// /// Creates a binding the specified value to the given member. /// /// The for the member which is being assigned to. /// The value to be assigned to . /// The created . public static MemberAssignment Bind(MemberInfo member, Expression expression) { ContractUtils.RequiresNotNull(member, "member"); RequiresCanRead(expression, "expression"); Type memberType; ValidateSettableFieldOrPropertyMember(member, out memberType); if (!memberType.IsAssignableFrom(expression.Type)) { throw Error.ArgumentTypesMustMatch(); } return new MemberAssignment(member, expression); } /// /// Creates a binding the specified value to the given property. /// /// The for the property which is being assigned to. /// The value to be assigned to . /// The created . public static MemberAssignment Bind(MethodInfo propertyAccessor, Expression expression) { ContractUtils.RequiresNotNull(propertyAccessor, "propertyAccessor"); ContractUtils.RequiresNotNull(expression, "expression"); ValidateMethodInfo(propertyAccessor); return Bind(GetProperty(propertyAccessor), expression); } private static void ValidateSettableFieldOrPropertyMember(MemberInfo member, out Type memberType) { var fi = member as FieldInfo; if (fi == null) { var pi = member as PropertyInfo; if (pi == null) { throw Error.ArgumentMustBeFieldInfoOrPropertInfo(); } if (!pi.CanWrite) { throw Error.PropertyDoesNotHaveSetter(pi); } memberType = pi.PropertyType; } else { memberType = fi.FieldType; } } } } #endif