U r пытающийся преобразовать объект, возвращенный из DataRow. Пункт [последовательность] собственность, которая не может быть установлена непосредственно.
string value = row[property.Name] == DBNull.Value?"":row[property.Name].ToString();
property.SetValue(item, Convert.ChangeType(value, property.PropertyType), null);
для ProductSpec можно использовать,
ProductSpec spec = ProductSpecIteration(property, row);
property.SetValue(item, Convert.ChangeType(spec , property.PropertyType), null);
Однако это будет хорошо работать, не изменяя тип, поскольку тип - то же самое как имущественный тип
Hope this helps.
You can read more about it here
You can also read more about IConvertible Interface here
IConvertible interface helps in returning a required value, since object does not implement IConvertible and hence cannot get the value in required format of the property type.