我只是想知道Convert
类和IConvertible
界面如何与DataRow
一起使用。如果我有这个代码:
string s="25";
int x= Convert.ToInt32(s);
对Convert.ToInt32(s)
的调用将执行以下操作:
((IConvertible)s).ToInt32()
那么如何使用这样的一行代码:
Convert.ToInt32(myDataRow["intField"]);
当DataRow和对象都没有实现IConvertible?
答案 0 :(得分:8)
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'."