2012-01-30 4 views
4

Je me demande simplement comment la classe Convert et l'interface IConvertible fonctionnent avec un DataRow. Si j'ai ce code:Comment fonctionne l'interface IConvertible avec DataRow?

string s="25"; 
int x= Convert.ToInt32(s); 

L'appel à Convert.ToInt32(s) se déroulera comme suit:

((IConvertible)s).ToInt32() 

Alors, comment cela fonctionne avec une ligne de code comme ceci:

Convert.ToInt32(myDataRow["intField"]); 

Lorsque ni DataRow ni objet implémentent IConvertible?

+0

appel d'une méthode transformera pas comme par magie en appelant une autre méthode . La méthode que vous appelez peut à son tour appeler une autre méthode, mais c'est quelque chose de différent. – svick

Répondre

7

Les champs DataRow sont exposés sous forme d'objets, de sorte que l'appel est fait à Convert.ToInt32(object value), qui fait exactement ce que vous avez dit dans votre question:

return value == null? 0: ((IConvertible)value).ToInt32(null); 

Le moteur d'exécution tente d'effectuer une conversion object-IConvertible. Peu importe que object n'implémente pas l'interface; ce qui importe est que quel que soit le type concret réel dans le DataRow à l'exécution doit implémenter l'interface. Tous les types de base CLR intégrés implémentent IConvertible, par exemple, de sorte qu'il appellera String.ToInt32() ou Boolean.ToInt32() ou autre. Les interfaces sont implémentées explicitement, donc vous ne pouvez pas appeler ces méthodes directement sur votre propre string ou bool, mais vous pouvez upcast à IConvertible et le faire.

object s = new System.String('1', 3); 
var i = Convert.ToInt32(s); 

// s = "111"; i = 111 

Si vous essayez d'exécuter cette méthode sur un objet qui ne met pas en œuvre IConvertible, vous obtiendrez une exception d'exécution typecast:

var o = new object(); 
var x2 = Convert.ToInt32(o); 

// throws System.InvalidCastException: "Unable to cast object of type 'System.Object' to type 'System.IConvertible'."