private Action<object, object> GetPropertySetter()
{
var propertyInfo = (PropertyInfo)_memberInfo;
var setMethodInfo = propertyInfo.GetSetMethod(true);
if (IsReadOnly)
{
var message = string.Format(
"The property '{0} {1}' of class '{2}' has no 'set' accessor. To avoid this exception, call IsReadOnly to ensure that setting a value is allowed.",
propertyInfo.PropertyType.FullName, propertyInfo.Name, propertyInfo.DeclaringType.FullName);
throw new BsonSerializationException(message);
}
// lambdaExpression = (obj, value) => ((TClass) obj).SetMethod((TMember) value)
var objParameter = Expression.Parameter(typeof(object), "obj");
var valueParameter = Expression.Parameter(typeof(object), "value");
var lambdaExpression = Expression.Lambda<Action<object, object>>(
Expression.Call(
Expression.Convert(objParameter, _memberInfo.DeclaringType),
setMethodInfo,
Expression.Convert(valueParameter, _memberType)
),
objParameter,
valueParameter
);
return lambdaExpression.Compile();
}