IConvertible接口如何与DataRow配合使用?

时间:2012-01-30 14:10:25

标签: c# .net datarow iconvertible

我只是想知道Convert类和IConvertible界面如何与DataRow一起使用。如果我有这个代码:

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

Convert.ToInt32(s)的调用将执行以下操作:

((IConvertible)s).ToInt32()

那么如何使用这样的一行代码:

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

当DataRow和对象都没有实现IConvertible?

1 个答案:

答案 0 :(得分:8)

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

如果您尝试在未实现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'."