using System;
using System.Reflection;
+using System.Reflection.Emit;
using System.Text;
namespace System.Linq.Expressions {
public Expression Expression {
get { return expression; }
}
+
+ internal MemberAssignment (MemberInfo member, Expression expression)
+ : base (MemberBindingType.Assignment, member)
+ {
+ this.expression = expression;
+ }
+
+ internal override void Emit (EmitContext ec, LocalBuilder local)
+ {
+ this.Member.OnFieldOrProperty (
+ field => EmitFieldAssignment (ec, field, local),
+ prop => EmitPropertyAssignment (ec, prop, local));
+ }
+
+ void EmitFieldAssignment (EmitContext ec, FieldInfo field, LocalBuilder local)
+ {
+ ec.EmitLoad (local);
+ expression.Emit (ec);
+ ec.ig.Emit (OpCodes.Stfld, field);
+ }
+
+ void EmitPropertyAssignment (EmitContext ec, PropertyInfo property, LocalBuilder local)
+ {
+ var setter = property.GetSetMethod (true);
+ if (setter == null)
+ throw new InvalidOperationException ();
+
+ ec.EmitLoad (local);
+ expression.Emit (ec);
+ ec.EmitCall (setter);
+ }
}
}