public virtual Expression CreateConvertExpression(
PropertyInfo sourceProperty,
PropertyInfo targetProperty,
ParameterExpression sourceParameter,
ParameterExpression targetParameter)
{
Guard.CheckArgumentNotNull(sourceProperty, "sourceProperty");
Guard.CheckArgumentNotNull(targetParameter, "targetParameter");
Guard.CheckArgumentNotNull(sourceParameter, "sourceParameter");
Guard.CheckArgumentNotNull(targetParameter, "targetParameter");
PropertyInfo innerProp;
bool checkProp = false;
MemberExpression targetGet = Expression.Property(targetParameter, targetProperty);
MemberExpression sourceGet = Expression.Property(sourceParameter, sourceProperty);
MemberExpression originalSourceGet = sourceGet;
if (!CanConvert(sourceProperty, targetProperty, out innerProp))
{
return null;
}
if (innerProp != null)
{
sourceGet = Expression.Property(sourceGet, innerProp);
checkProp = true;
}
Expression valueGet = sourceGet;
Expression assignment = Expression.Assign(targetGet, valueGet);
if (checkProp)
{
BinaryExpression nullComparison = Expression.NotEqual(originalSourceGet, Expression.Constant(null));
assignment = Expression.IfThen(nullComparison, assignment);
}
// TODO: add try catch blocks here, to provide the correct property names upon errors.
return assignment;
}