2012-01-30 2 views
4

Мне просто интересно, как класс Convert и интерфейс IConvertible работают с DataRow. Если у меня есть этот код:Как работает интерфейс IConvertible с DataRow?

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

Вызов Convert.ToInt32(s) будет работать следующим образом:

((IConvertible)s).ToInt32() 

Так как это работает с строки кода, как это:

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

Когда ни DataRow, ни объект не реализуют IConvertible?

+0

Вызов метода не будет волшебным образом превратить в вызов другой метод , Метод, который вы назвали, может в свою очередь вызвать другой метод, но это что-то другое. – svick

ответ

7

Поля DataRow подвергаются как объекты, так что вызов на Convert.ToInt32(object value), который делает именно то, что вы сказали в своем вопросе:

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

Среда пытается выполнить преобразование из object в IConvertible. Не имеет значения, что object не реализует интерфейс; важно то, что любой фактический, конкретный тип в DataRow во время выполнения должен реализовать интерфейс. Например, все встроенные базовые типы CLR реализуют IConvertible, поэтому он будет звонить String.ToInt32() или Boolean.ToInt32() или что угодно. Интерфейсы реализованы явно, поэтому вы не можете напрямую обращаться к этим методам самостоятельно string или bool, но вы можете повышать до IConvertible и делать это.

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

// s = "111"; i = 111 

Если вы попытаетесь запустить этот метод на объекте, который не реализует IConvertible, вы получите во время выполнения исключение: напечатанный материал

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

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