Ваш второй (рекурсивный) вызов clone
передает результат GetValue
в качестве второго аргумента, который имеет тип object
, и, следовательно, T
равен object
.
т.е.
fi.SetValue(tempMyClass, this.clone(fi.GetValue(original), fi.GetValue(original)));
Результат GetValue
на FieldInfo
равен object
.
Учитывая, что во всех случаях вы передаете одно и то же дважды, возможно, метод clone
ошибочен. Вам, вероятно, там не нужны дженерики. Просто используйте obj.GetType()
, чтобы получить информацию о типе второго аргумента (если вам действительно нужен второй аргумент).
Было бы более разумно ограничить тип возвращаемого значения с помощью обобщений, чтобы приведение не было необходимости на вызывающей стороне. Также вы можете превратить Clone в метод расширения, чтобы он мог применяться ко всему.
С другой стороны, то, что вы пытаетесь сделать (автоматический глубокий клон), вряд ли будет вообще полезным. Большинство классов в конечном итоге содержат ссылки на вещи, которыми они не владеют, поэтому, если вы клонируете такой объект, вы в конечном итоге случайно клонируете половину своей прикладной инфраструктуры.