我只是想知道 Convert
类和 IConvertible
接口(interface)如何与 DataRow
一起工作。如果我有这个代码:
string s="25";
int x= Convert.ToInt32(s);
对
Convert.ToInt32(s)
的调用将运行以下内容:((IConvertible)s).ToInt32()
那么这如何与这样的一行代码一起工作:
Convert.ToInt32(myDataRow["intField"]);
当 DataRow 和对象都没有实现 IConvertible 时?
最佳答案
DataRow 字段作为对象公开,因此调用 Convert.ToInt32(object value)
,这正是您在问题中所说的:
return value == null? 0: ((IConvertible)value).ToInt32(null);
运行时尝试执行从
object
到 IConvertible
的转换。 object
没有实现接口(interface)没关系;重要的是,运行时 DataRow
中的任何实际的、具体的类型都必须实现该接口(interface)。例如,所有内置的 CLR 基本类型都实现了 IConvertible
,因此它将调用 String.ToInt32()
或 Boolean.ToInt32()
或其他什么。接口(interface)是显式实现的,因此您不能直接在自己的 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'."
关于c# - IConvertible 接口(interface)如何与 DataRow 配合使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9065123/