Прочитать на английском

Поделиться через


IConvertible Интерфейс

Определение

Важно!

Этот API несовместим с CLS.

Определяет методы, которые преобразуют значение реализующей ссылки или типа значения в тип среды CLR с эквивалентным значением.

C#
[System.CLSCompliant(false)]
public interface IConvertible
C#
[System.CLSCompliant(false)]
[System.Runtime.InteropServices.ComVisible(true)]
public interface IConvertible
Производный
Атрибуты

Примеры

В следующем примере кода демонстрируется реализация для комплексного IConvertible класса чисел, что позволяет сначала привести его в качестве Double значения, а затем вызвать статические Convert члены для этого Doubleкласса.

C#
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;
            }
        }
    }
}

Комментарии

Этот интерфейс предоставляет методы для преобразования значения экземпляра реализующего типа в тип среды CLR, имеющий эквивалентное значение. Типы среды CLR: Boolean, SByte, Byte, Int64UInt16Int16SingleUInt64Int32UInt32Double, Decimal, и . DateTimeCharString

Если не существует значимого преобразования в тип среды CLR, то определенная реализация метода интерфейса вызывает исключение InvalidCastException. Например, если этот интерфейс реализуется в логическом типе, реализация ToDateTime метода вызывает исключение, так как нет значимого DateTime эквивалента логическому типу.

Среда CLR обычно предоставляет IConvertible интерфейс через Convert класс. Среда CLR также использует IConvertible интерфейс внутри явных реализаций интерфейса, чтобы упростить код, используемый для поддержки преобразований в Convert классах и базовых типах среды CLR.

IConvertible Помимо интерфейса, платформа .NET Framework предоставляет классы, называемые преобразователями типов для преобразования пользовательских типов данных в другие типы данных. Дополнительные сведения см. в разделе " Обобщенное преобразование типов ".

Примечания для тех, кто реализует этот метод

Если вы реализуете IConvertible интерфейс, реализация будет вызываться методом автоматически, если Object параметр является экземпляром ChangeType(Object, Type) реализующего типа, а Type параметр является типом среды CLR.

Большинство методов преобразования имеют параметр типа IFormatProvider , который представляет текущий язык и региональные параметры (CurrentCulture) или конкретный язык и региональные параметры. По большей части IConvertible реализации базовых типов игнорируют этот параметр. Однако вы можете выбрать, следует ли использовать его в коде.

Методы

GetTypeCode()

Возвращает TypeCode для этого экземпляра.

ToBoolean(IFormatProvider)

Преобразует значение этого экземпляра в эквивалентное ему логическое значение с использованием указанных сведений об особенностях форматирования, связанных с языком и региональными параметрами.

ToByte(IFormatProvider)

Преобразует значение этого экземпляра в эквивалентное ему 8-битовое целое число без знака с использованием указанных сведений об особенностях форматирования, связанных с языком и региональными параметрами.

ToChar(IFormatProvider)

Преобразует значение этого экземпляра в эквивалентный символ Юникода с использованием указанных сведений об особенностях форматирования, связанных с языком и региональными параметрами.

ToDateTime(IFormatProvider)

Преобразует значение этого экземпляра в эквивалентную строку DateTime с использованием указанных сведений об особенностях форматирования, связанных с языком и региональными параметрами.

ToDecimal(IFormatProvider)

Преобразует значение этого экземпляра в эквивалентное число типа Decimal с использованием указанных сведений об особенностях форматирования, связанных с языком и региональными параметрами.

ToDouble(IFormatProvider)

Преобразует значение этого экземпляра в эквивалентное число двойной точности с плавающей запятой с использованием указанных сведений об особенностях форматирования, связанных с языком и региональными параметрами.

ToInt16(IFormatProvider)

Преобразует значение этого экземпляра в эквивалентное ему 16-битовое целое число со знаком с использованием указанных сведений об особенностях форматирования, связанных с языком и региональными параметрами.

ToInt32(IFormatProvider)

Преобразует значение этого экземпляра в эквивалентное ему 32-битовое целое число со знаком с использованием указанных сведений об особенностях форматирования, связанных с языком и региональными параметрами.

ToInt64(IFormatProvider)

Преобразует значение этого экземпляра в эквивалентное ему 64-битовое целое число со знаком с использованием указанных сведений об особенностях форматирования, связанных с языком и региональными параметрами.

ToSByte(IFormatProvider)

Преобразует значение этого экземпляра в эквивалентное ему 8-битовое целое число со знаком с использованием указанных сведений об особенностях форматирования, связанных с языком и региональными параметрами.

ToSingle(IFormatProvider)

Преобразует значение этого экземпляра в эквивалентное число одинарной точности с плавающей запятой с использованием указанных сведений об особенностях форматирования, связанных с языком и региональными параметрами.

ToString(IFormatProvider)

Преобразует значение этого экземпляра в эквивалентную строку String с использованием указанных сведений об особенностях форматирования, связанных с языком и региональными параметрами.

ToType(Type, IFormatProvider)

Преобразует значение этого экземпляра в объект Object указанного типа Type, имеющий эквивалентное значение, с использованием указанных сведений об особенностях форматирования, связанных с языком и региональными параметрами.

ToUInt16(IFormatProvider)

Преобразует значение этого экземпляра в эквивалентное ему 16-битовое целое число без знака с использованием указанных сведений об особенностях форматирования, связанных с языком и региональными параметрами.

ToUInt32(IFormatProvider)

Преобразует значение этого экземпляра в эквивалентное ему 32-битовое целое число без знака с использованием указанных сведений об особенностях форматирования, связанных с языком и региональными параметрами.

ToUInt64(IFormatProvider)

Преобразует значение этого экземпляра в эквивалентное ему 64-битовое целое число без знака с использованием указанных сведений об особенностях форматирования, связанных с языком и региональными параметрами.

Применяется к

Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

См. также раздел