我只是想知道 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);

运行时尝试执行从 objectIConvertible 的转换。 object 没有实现接口(interface)没关系;重要的是,运行时 DataRow 中的任何实际的、具体的类型都必须实现该接口(interface)。例如,所有内置的 CLR 基本类型都实现了 IConvertible ,因此它将调用 String.ToInt32()Boolean.ToInt32() 或其他什么。接口(interface)是显式实现的,因此您不能直接在自己的 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'."

关于c# - IConvertible 接口(interface)如何与 DataRow 配合使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9065123/

10-10 05:08