Réponse acceptée !
Pour le string et le int :
Le problème du Cast dans un object est que ça va faire des opérations de boxing / unboxing du int (car c'est un type valeur).
Et malheureusement c'est pas très bon côté performances...

Après, il faudrait tester si ce Cast + le GetType() est plus rapide que le Int.TryCast(), mais dans tous les cas c'est de la bidouille.
Pour les OracleDataXXXX, tu peux renvoyer un object et faire un Cast, ça ira mais ce sera pas très...propre
Dans les deux cas, le mieux serait :
- soit de séparer en deux fonctions différentes.
- soit de créer une classe ReturnInfos (par exemple), qui aurait deux propriété, une de type String, l'autre Int (et une classe OracleReturnInfos avec une de type OracleDataAdapter, l'autre de type OracleDataReader), et ensuite de renvoyer un objet de type ReturnInfos en paramètre. La classe appellante aura ensuite juste à tester laquelle des deux propriétés n'est pas nulle, et ça y est elle a sa valeur, le tout sans aucun cast !

Mais tout ce bazard vient surtout d'un problème d'architecture de ta couche d'accès aux données : normalement, quand on utilises un DataReader, on n'utilises pas un DataAdapter... !
La 3ème (et la vrai) solution serait de restructurer tes classes qui gèrent l'accès aux données.
(merci poppyto de m'avoir réveillé, je lui ait donné une solution sans même lui donner les autres, sans les explications, etc...

)

Nurgle (Antoine)