IConvertable接口如何与DataRow一起工作

本文关键字:DataRow 一起 工作 接口 IConvertable | 更新日期: 2023-09-27 18:21:48

我只是想知道Convert类和IConvertible接口如何与DataRow一起工作。如果我有这个代码:

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

Convert.ToInt32(s)的调用将运行以下内容:

((IConvertible)s).ToInt32()

那么,这是如何与这样一行代码一起工作的:

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

当DataRow和对象都没有实现IConvertable时?

IConvertable接口如何与DataRow一起工作

DataRow字段被公开为对象,因此调用Convert.ToInt32(object value),这与您在问题中所说的完全一样:

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

运行时尝试执行从objectIConvertible的转换。object没有实现接口并不重要;重要的是,无论DataRow中的实际具体类型在运行时是什么,都必须实现该接口。例如,所有内置的CLR基类型都实现IConvertible,因此它将调用String.ToInt32()Boolean.ToInt32()或其他任何类型。接口是显式实现的,因此您不能在自己的stringbool上直接调用这些方法,但您可以升级到IConvertible并执行此操作

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

如果你试图在一个没有实现IConvertable的对象上运行该方法,你会得到一个运行时类型转换异常:

var o = new object();
var x2 = Convert.ToInt32(o);
// throws System.InvalidCastException: "Unable to cast object of type 'System.Object' to type 'System.IConvertible'."