繁体   English   中英

是否Convert.ChangeType快捷方式?

[英]Does Convert.ChangeType Shortcut?

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

例如:

object objString = "Hello World";

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

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

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

  • 如果输入为空
    • 如果类型是值类型,则抛出。
    • 否则返回null。
  • 如果输入不是IConvertible
    • 如果类型恰好是输入的类型,则返回输入。
    • 否则抛出。
  • 如果该类型是现成的核心可转换类型之一,请在输入上调用相应的ToWhatever方法。
    • 在每种情况下,如果类型匹配,则实现似乎return this ,否则return Convert.ToWhatever(this) ,这是一种排序的快捷方式。
  • 否则,在输入上调用ToType ,以传递类型。

是的,它将在对象上调用IConvertible接口。 如果是字符串,它将调用objString.ToString(),而objString.ToString()随后将返回自身(返回此值)。

另外,如果对象类型未实现IConvertible,而您转换为相同类型,则它将仅返回相同对象。

如果type不实现IConvertible,而您将其转换为其他类型,则将引发异常。

此MSDN博客文章可能会为您提供帮助。

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

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

可以将ChangeType视为一个很大的switch语句(在VB中选择大小写)…具有许多重载函数。 这样的事情(免责声明:这旨在成为伪代码,而不是确切的.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接口的类必须在上面的开关结构中加上GetTypeCode来实现所有转换:

·GetTypeCode

·布尔值

·ToByte

·托查

·ToDateTime

·十进制

·ToDouble

·ToInt16

·ToInt32

·ToInt64

·ToSByte

·ToSingle

·ToString

· 输入

·ToUInt16

·ToUInt32

·ToUInt64

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM