Другой вариант - ограничить ваш тип T значением IConvertible.
Если вы сделаете это, вы можете добавить метод, который создает foo определенного типа, используя IConvertible.ToType, чтобы преобразовать его непосредственно в ваш тип.
Это будет работать для string и int, а также для любого другого типа, который реализует IConvertible, но только для этих типов.