IConvertible接口用法揭秘

本文介绍了如何为自定义类实现IConvertible接口,使该类能够进行类型转换。文章通过PhoneNumber类的示例展示了如何实现该接口的方法,并解释了在无法转换时抛出InvalidCastException异常的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章一开始,给出下面的实例代码。

public class PhoneNumber:IConvertible
{
    string value;
    PhoneNumber(string value)
    {
        this.value = value;
    }
    public TypeCode GetTypeCode()
    {
        return TypeCode.Object;
    }
    public string ToString(IFormatProvider provider)
    {
        return value.ToString();
    }
    public double ToDouble(IFormatProvider provider)
    {
        return Convert.ToDouble(value);
    }
    public DateTime ToDateTime(IFormatProvider provider)
    {
        throw new InvalidCastException("PhoneNumber To DateTime Convertion Is Wrong");
    }
...此处省略其他方法的实现
}

代码定义了PhoneNumber类,表示电话号码。

该类实现了IConvertible接口这样PhoneNumber类就可以通过实现IConvertible接口提供的各种方法来进行类型转换了。

接下来,对IConvertible接口做一个简单的介绍。

IConvertible接口:定义特定的方法,这些方法将实现引用或值类型的值转换为具有等效值的公共语言运行库类型。 (MSDN)

从上面的定义中可以看出,IConvertible接口定义的方法主要是为了将值或者引用类型的值转换成公共语言运行库类型,我们知道公共语言运行库类型包括: BooleanSByteByteInt16UInt16Int32UInt32Int64UInt64SingleDoubleDecimalDateTimeChar 和 String。其实,到这里,我们便可以猜想到IConvertible接口都定义了哪些方法。具体列表看下面。

这里出现了一个问题。当我们的类实现IConvertible接口时,那是不是所有方法都必须实现呢?要是我们的类到某些类型根本无法转换时,我们又该怎么处理呢?

首先,类实现IConvertible接口,是应该实现该接口定义的所有的方法的。

其次,当类的值无法转换为某种公共语言运行库类型时,应该引发 InvalidCastException异常,如示例代码中ToDateTime方法中的处理所示。

接口中的GetTypeCode方法返回类对象TypeCode TypeCode为一个枚举类型,用于指定对象的类型。其成员如下所示。

那么,.NET类库中有哪些类实现了IConvertible接口呢?

看下图所示。

最后,以System.Boolean为例来看看IConvertible接口的实现。进一步加深印象。

查看System.Boolean源代码。了解到,System.Boolea实现了IConvertible接口的所有方法,下面给出其中3个方法的实现代码。

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

char IConvertible.ToChar(IFormatProvider provider)
{
    throw new InvalidCastException(Environment.GetResourceString("InvalidCast_FromTo", new object[] { "Boolean", "Char" }));
}

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

通过源码学习,你会发现许多转换操作最终都会调用Convert 类中的方法来实现。关于这点,MSDN也有说明,通常,公共语言运行库通过 Convert 类公开 IConvertible 接口。

呵呵,好了,撸撸去了。

88

在C#中,TypeConverter是一个提供类型转换服务的组件,主要用于支持用户界面对复杂类型的数据输入和显示。它允许将一种数据类型转换成另一种,并在不同的界面环境中提供一致的行为。以下是TypeConverter的基本使用方法: 1. **创建自定义转换器**: - 首先,你需要创建一个实现了ITypeDescriptorContext和IConvertible接口的类,如ConverterClass。 ```csharp class MyConverter : TypeConverter { public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { // 检查是否可以转换到destinationType } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { // 将value转换为目标类型并返回 } } ``` 2. **注册转换器**: 使用`RegisterConverter()`方法将自定义的转换器添加到系统,通常在应用程序的启动时执行: ```csharp TypeDescriptor.AddAttributes(typeof(MyCustomClass), new TypeConverterAttribute(new MyConverter())); ``` 3. **应用转换**: 在需要的地方,你可以使用TypeConverter提供的方法进行转换,例如在Windows Forms的属性编辑器、设置面板或文本框中: ```csharp string inputText = "123"; int num = (int)TypeDescriptor.GetConverter(typeof(MyCustomClass)).ConvertFromInvariantString(inputText); ``` 4. **验证输入**: `CanConvertFrom()`方法可以检查给定值是否可以转换为指定的类型,而`IsValidValue()`则可以校验某个值是否有效: ```csharp if (!TypeDescriptor.GetConverter(typeof(MyCustomClass)).CanConvertFrom(typeof(string))) { Console.WriteLine("Invalid input format"); } ``` 5.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值