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?
DataRow字段作为对象公开,因此进行调用Convert.ToInt32(object value)
,这与您在问题中所说的完全相同:
return value == null? 0: ((IConvertible)value).ToInt32(null);
Run Code Online (Sandbox Code Playgroud)
运行时试图从执行转换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
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)