private Func<object, object> GetGetter()
{
var propertyInfo = _memberInfo as PropertyInfo;
if (propertyInfo != null)
{
var getMethodInfo = propertyInfo.GetGetMethod(true);
if (getMethodInfo == null)
{
var message = string.Format(
"The property '{0} {1}' of class '{2}' has no 'get' accessor.",
propertyInfo.PropertyType.FullName, propertyInfo.Name, propertyInfo.DeclaringType.FullName);
throw new BsonSerializationException(message);
}
}
// lambdaExpression = (obj) => (object) ((TClass) obj).Member
var objParameter = Expression.Parameter(typeof(object), "obj");
var lambdaExpression = Expression.Lambda<Func<object, object>>(
Expression.Convert(
Expression.MakeMemberAccess(
Expression.Convert(objParameter, _memberInfo.DeclaringType),
_memberInfo
),
typeof(object)
),
objParameter
);
return lambdaExpression.Compile();
}