public override DynamicMetaObject BindSetMember(SetMemberBinder binder, DynamicMetaObject value)
{
var descriptor = (Value as DynamicObject)._ownerDescriptor;
var idx = descriptor._fields.FindIndex(p => p.Key == binder.Name);
return new DynamicMetaObject(Expression.Call(Expression.Convert(Expression, LimitType),
typeof(DynamicObject).GetMethod("SetFieldByIdx"),
Expression.Constant(idx),
Expression.Constant(binder.Name),
Expression.Constant(descriptor),
Expression.Convert(value.Expression, typeof(object))),
BindingRestrictions.GetTypeRestriction(Expression, LimitType));
}