public override DynamicMetaObject BindSetMember(SetMemberBinder binder, DynamicMetaObject value)
{
var propertyName = binder.Name;
var propertyType = binder.ReturnType;
RegisterPropertyIfNotYetRegistered(propertyName, propertyType);
var valueExpression = Expression.Convert(value.Expression, typeof (object));
var parameters = new Expression[]
{
Expression.Constant(propertyName),
valueExpression
};
var self = Expression.Convert(Expression, LimitType);
var methodCall = Expression.Call(self, _setValueFastMethodInfo, parameters);
// Note: required because we must return a value as well
var finalExpression = Expression.Block(methodCall, valueExpression);
var restrictions = BindingRestrictions.GetTypeRestriction(Expression, LimitType);
var setValue = new DynamicMetaObject(finalExpression, restrictions);
return setValue;
}