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

Rom*_*man 4 .net c# datarow iconvertible

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

string s="25";
int x= Convert.ToInt32(s);
Run Code Online (Sandbox Code Playgroud)

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

((IConvertible)s).ToInt32()
Run Code Online (Sandbox Code Playgroud)

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

Convert.ToInt32(myDataRow["intField"]);
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*eld 8

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

return value == null? 0: ((IConvertible)value).ToInt32(null);
Run Code Online (Sandbox Code Playgroud)

运行时试图从执行转换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
Run Code Online (Sandbox Code Playgroud)

如果您尝试在未实现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'."
Run Code Online (Sandbox Code Playgroud)