Не пользуйтесь этой идеей - это то, что
mazzy называет "программистским подходом". Из моего скромного опыта, в долгосрочной перспективе эта идея несет куда больше проблем, чем удобств. Дело в том, что:
- в приведенном коде как минимум нужно еще проверять длину строковых полей и ArraySize;
- совпадение названия и базового типа полей в двух произвольных таблицах не означает автоматом, что эти поля содержат одну и ту же информацию;
- вы не получите перекрестных ссылок, которые помогут выявить, откуда в поля результирующей таблицы попадают значения; при использовании Map'а по крайней мере будут перекрестные ссылки на поля Map'а;
- вы будете ограничены в именовании полей, могут возникнуть сложности, если в одной таблице поле с каким-то префиксом/суффиксом (кастомизация), а в другой - нет (таблица создана вами, и там достаточно префикса в названии таблицы);
- копирование не будет сопровождаться вызовом каких-либо обработчиков изменения полей, которые в той или иной таблице могут подтянуть значения связанных полей;
- самое главное: вы не сможете контролировать, какие именно поля надо копировать, а какие нет.
Зачастую нужно копировать "все поля, кроме таких-то", из-за чего к одной строке вызова buf2buf() или подобного метода добавляется фигова туча строк кода, вычищающего значения полей, которые копировать не надо было, либо которые надо брать из других источников. При этом из-за отсутствия перекрестных ссылок (см. выше) нужно либо самому помнить, что при добавлении нового поля в обе таблицы надо подумать о том, копировать ли его и если копировать, то при каких условиях, либо надо будет решать такие вопросы по факту, исправляя некорректные данные ("ой, а вот тот флажок не должен был копироваться в новые записи"). В общем, я лично для себя решил, что наиболее оптимальный вариант - это использование методов типа initFromXXTable(): такой код и в перекрестные ссылки попадает, и поля явно заданы - не возникнет неожиданных эффектов при создании новых полей, и код можно разбить на несколько методов, скажем, вместо копирования кода клиента или договора сделать отдельные initFromCustTable(), initFromRContractTable() и вызывать их в initFromXXTable(). Первоначальные затраты на написание такого кода выше, но он намного более предсказуем, его куда легче сопровождать и развивать.