obsidian/笔记文件/2.笔记/IConvertible 接口.md
2025-03-26 00:02:56 +08:00

9.1 KiB
Raw Permalink Blame History

#unity/日常积累

命名空间:

System

程序集:

System.Runtime.dll

重要

此 API 不符合 CLS。

定义将实现引用或值类型的值转换为具有等效值的公共语言运行时类型的方法。

[System.CLSCompliant(false)]
public interface IConvertible

派生

System.DBNull

更多…

属性

CLSCompliantAttribute

示例

下面的代码示例演示了复数类的IConvertible实现,允许先将其强制转换为静态Double成员,然后调用该Double类上的静态Convert成员。

using System;

namespace ConsoleApplication2
{

    /// Class that implements IConvertible
    class Complex : IConvertible
    {
        double	x;
        double	y;

        public Complex(double x, double y)
        {
            this.x = x;
            this.y = y;
        }

        public TypeCode GetTypeCode()
        {
            return TypeCode.Object;
        }

        bool IConvertible.ToBoolean(IFormatProvider provider)
        {
            if(	(x != 0.0) || (y != 0.0) )
                return true;
            else
                return false;
        }

        double GetDoubleValue()
        {
            return Math.Sqrt(x*x + y*y);
        }

        byte IConvertible.ToByte(IFormatProvider provider)
        {
            return Convert.ToByte(GetDoubleValue());
        }

        char IConvertible.ToChar(IFormatProvider provider)
        {
            return Convert.ToChar(GetDoubleValue());
        }

        DateTime IConvertible.ToDateTime(IFormatProvider provider)
        {
            return Convert.ToDateTime(GetDoubleValue());
        }

        decimal IConvertible.ToDecimal(IFormatProvider provider)
        {
            return Convert.ToDecimal(GetDoubleValue());
        }

        double IConvertible.ToDouble(IFormatProvider provider)
        {
            return GetDoubleValue();
        }

        short IConvertible.ToInt16(IFormatProvider provider)
        {
            return Convert.ToInt16(GetDoubleValue());
        }

        int IConvertible.ToInt32(IFormatProvider provider)
        {
            return Convert.ToInt32(GetDoubleValue());
        }

        long IConvertible.ToInt64(IFormatProvider provider)
        {
            return Convert.ToInt64(GetDoubleValue());
        }

        sbyte IConvertible.ToSByte(IFormatProvider provider)
        {
            return Convert.ToSByte(GetDoubleValue());
        }

        float IConvertible.ToSingle(IFormatProvider provider)
        {
            return Convert.ToSingle(GetDoubleValue());
        }

        string IConvertible.ToString(IFormatProvider provider)
        {
            return String.Format("({0}, {1})", x, y);
        }

        object IConvertible.ToType(Type conversionType, IFormatProvider provider)
        {
            return Convert.ChangeType(GetDoubleValue(),conversionType);
        }

        ushort IConvertible.ToUInt16(IFormatProvider provider)
        {
            return Convert.ToUInt16(GetDoubleValue());
        }

        uint IConvertible.ToUInt32(IFormatProvider provider)
        {
            return Convert.ToUInt32(GetDoubleValue());
        }

        ulong IConvertible.ToUInt64(IFormatProvider provider)
        {
            return Convert.ToUInt64(GetDoubleValue());
        }
    }

    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
        static void Main(string[] args)
        {

            Complex		testComplex = new Complex(4,7);

            WriteObjectInfo(testComplex);
            WriteObjectInfo(Convert.ToBoolean(testComplex));
            WriteObjectInfo(Convert.ToDecimal(testComplex));
            WriteObjectInfo(Convert.ToString(testComplex));
        }

        static void WriteObjectInfo(object testObject)
        {
            TypeCode	typeCode = Type.GetTypeCode( testObject.GetType() );

            switch( typeCode )
            {
                case TypeCode.Boolean:
                    Console.WriteLine("Boolean: {0}", testObject);
                    break;

                case TypeCode.Double:
                    Console.WriteLine("Double: {0}", testObject);
                    break;
                                
                default:
                    Console.WriteLine("{0}: {1}", typeCode.ToString(), testObject);
                    break;
            }
        }
    }
}

注解

此接口提供将实现类型的实例的值转换为具有等效值的公共语言运行时类型的方法。 公共语言运行时类型包括BooleanSByte、、ByteUInt16Int16DoubleSingleInt64UInt32Int32DecimalDateTimeUInt64Char和。String

如果公共语言运行时类型没有有意义的转换,则会引发 InvalidCastException特定的接口方法实现。 例如,如果此接口是在布尔类型上实现的,则该方法的 ToDateTime 实现将引发异常,因为布尔类型没有有意义的 DateTime 等效项。

公共语言运行时通常通过Convert类公开IConvertible接口。 公共语言运行时还使用 IConvertible 内部的接口,在显式接口实现中,以简化用于支持类中的 Convert 转换和基本公共语言运行时类型的转换的代码。

除了IConvertible接口,.NET Framework还提供称为类型转换器的类用于将用户定义的数据类型转换为其他数据类型。 有关详细信息,请参阅 通用类型转换 主题。

实施者说明

如果实现IConvertible接口,则如果参数是实现类型的实例,并且参数是公共语言运行时类型,则Type该方法会自动调用ChangeType(Object, Type)Object实现。

大多数转换方法都有一个类型 IFormatProvider 参数,表示当前区域性 () CurrentCulture 或特定区域性。 在大多数情况下, IConvertible 基类型的实现将忽略此参数。 但是,可以选择是否在代码中使用它。