1

我想知道Object Convert.ChangeType( Object object, Type type)当类型object匹配时内部会发生什么type。它只是捷径并返回object吗?

例如:

object objString = "Hello World";

string converted = (string) Convert.ChangeType( objString, typeof ( String ) );

实现会ChangeType实际调用IConvertible接口还是只返回 objString?

4

3 回答 3

6

根据Microsoft 的 C# 参考源Convert.ChangeType(Object, Type)执行以下一般行为:

  • 如果输入为空
    • 如果类型是值类型,则抛出。
    • 否则返回null。
  • 如果输入不是IConvertible
    • 如果类型正是输入的类型,则返回输入。
    • 否则扔。
  • 如果类型是开箱即用的核心可转换类型之一,则ToWhatever在输入上调用相应的方法。
    • 在每种情况下,实现似乎是return this类型是否匹配return Convert.ToWhatever(this),这是一种快捷方式。
  • 否则调用ToType输入,传递类型。
于 2012-10-08T14:55:29.067 回答
2

是的,它会在对象上调用 IConvertible 接口。如果是字符串,它会调用 objString.ToString() ,而后者又会返回自身(返回 this)。

此外,如果对象的类型没有实现 IConvertible 并且您转换为相同的类型,那么它只会返回相同的对象。

如果 type 没有实现 IConvertible 并且您转换为不同的类型,则会引发异常。

于 2012-10-08T13:24:55.770 回答
0

这篇 MSDN 博客文章可能会对您有所帮助。

如果该类实现了 IConvertable 接口,则可以使用 System.Convert.ChangeType 更改数据类型:

decimal x = (decimal) System.Convert.ChangeType("5", typeof(decimal));

把 ChangeType 想象成一个大的 switch 语句(在 VB 中选择 case)……有很多重载的函数。像这样的东西(免责声明:这是一个伪代码,而不是确切的 .NET 实现):

public static Object ChangeType(Object value, TypeCode typeCode , IFormatProvider provider)
{

IConvertible v = value as IConvertible;

switch (typeCode) {

case TypeCode.Boolean:
    return v.ToBoolean(provider);

case TypeCode.Char:
    return v.ToChar(provider);

case TypeCode.SByte:
    return v.ToSByte(provider);

case TypeCode.Byte:
    return v.ToByte(provider);

case TypeCode.Int16:
    return v.ToInt16(provider);

case TypeCode.UInt16:
    return v.ToUInt16(provider);

. . .

}

一个声称实现 IConvertible 接口的类必须实现上面 switch 结构中的所有转换加上 GetTypeCode:

· 获取类型代码

· ToBoolean

· ToByte

· ToChar

· 到日期时间

· 转十进制

· 对双

· ToInt16

· ToInt32

· ToInt64

· ToSByte

· 转单

· ToString

· 输入

· ToUInt16

· ToUInt32

· ToUInt64

System.Convert 类有许多实现,这些实现又可以由实现 IConvertible 接口的类调用。

于 2012-10-08T13:31:02.297 回答