transferencia de valores de propiedades de un objeto a otro

Antes de todo, sé sobre AutoMapper, y no quiero usarlo. Porque estoy aprendiendoC y quiero recibir una visión profunda de ello. Así que estoy tratando de resolver este problema (explicado a continuación) yo mismo.

Sin embargo, estoy tratando de crear una copiadora de propiedades para hacer frente a los valores de las propiedades de un tipo a otro, si la propiedad tiene el mismo nombre y tipo y es legible desde el origen y se puede escribir en el destino. Estoy usandotype.GetProperties() método. El método muestreado está aquí:

    static void Transfer(object source, object target) {

        var sourceType = source.GetType();
        var targetType = target.GetType();

        var sourceProps = sourceType.GetProperties(BindingFlags.Public | BindingFlags.Instance);

        var targetProps = (from t in targetType,.GetProperties()
                           where t.CanWrite
                                 && (t.GetSetMethod().Attributes & MethodAttributes.Static) == 0
                           select t).ToList();

        foreach(var prop in sourceProps) {
            var value = prop.GetValue(source, null);
            var tProp = targetProps
                .FirstOrDefault(p => p.Name == prop.Name &&
                    p.PropertyType.IsAssignableFrom(prop.PropertyType));
            if(tProp != null)
                tProp.SetValue(target, value, null);
        }
    }

Funciona, pero leí una respuesta en SO, que usandoSystem.Reflection.Emit yILGenerator y delegados vinculados tarde son más rápidos y tienen un mayor rendimiento. Pero no hubo más explicaciones ni ningún enlace. ¿Me pueden ayudar a comprender formas de acelerar este código? o puedes sugerirme algunos enlaces sobreEmit, ILGenerator y delegados vinculados tarde ¿Por favor? ¿O algo que creas que me ayudará a someterme? Gracias por adelantado

COMPELETE Q:

Entiendo y aprendo muchas cosas de la respuesta de @ svick. Pero ahora, si quiero usarlo como un método genérico abierto, ¿cómo puedo hacerlo? algo como esto

public TTarget Transfer<TSource, TTarget>(TSource source) where TTarget : class, new() { } 

o una extensión:

public static TTarget Transfer<TSource, TTarget>(this TSource source) where TTarget : class, new() { } 

Respuestas a la pregunta(8)

Su respuesta a la pregunta