передача значений одного свойства объекта другому

Прежде всего, я знаю оAutoMapperи я не хочу этим пользоваться. Потому что я учусьC # и я хочу получить глубокое представление об этом. Поэтому я пытаюсь решить эту проблему (объяснено ниже) самостоятельно.

Тем не менее, я пытаюсь создать копир свойства, чтобы сопоставить значения свойств одного типа с другим, если свойство имеет то же имя и тип и доступно для чтения из источника и доступно для записи в target. я используюtype.GetProperties() метод. Выборочный метод здесь:

    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);
        }
    }

Это работает, но я прочитал ответ на SO, что с помощьюSystem.Reflection.Emit а такжеILGenerator а такжеопоздавшие делегаты быстрее и имеют более высокую производительность. Но не было больше объяснения или какой-либо ссылки. Можете ли вы помочь мне понять способы ускорить этот код? или вы можете предложить мне несколько ссылок оEmit, ILGenerator, а такжеопоздавшие делегаты пожалуйста? Или что-то, что вы думаете, поможет мне в тему? Заранее спасибо.

ЗАВЕРШИТЕ Q:

Я понимаю и многому научусь из ответа @ svick. Но теперь, если я хочу использовать его как открытый универсальный метод, как я могу это сделать? что-то вроде этого:

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

или расширение:

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