用于与MyClass之间进行转换的TypeConverter是否能够转换MyClass ?

本文关键字:MyClass 转换 是否 TypeConverter 之间 用于 | 更新日期: 2023-09-27 18:13:32

假设我有一个MyClass,它有一个TypeConverter

[TypeConverter(typeof(MyClassConverter))]
public class MyClass
{
    // Insert code here.
}
public class MyClassConverter : System.ComponentModel.TypeConverter
{
    public override bool CanConvertFrom(Type destType)
    {
        // Insert code here.
    }
}
... etc

MyClassConverter应该能够转换MyClass类型的对象吗?

如果是这样,如果MyClassConverter被要求将MyClass的对象转换为MyClass的对象,它应该返回原始的MyClass还是它的副本?

我看到微软有一些不一致的行为:

int i = 4;
TypeConverter typeConverter = new TypeConverter();
bool b = typeConverter.CanConvertTo(typeof(int))

b似乎等于false。如果我想使用PointConverter将System.Drawing.Point转换为System.Drawing.Point,我也会看到类似的行为。但是显然字符串可以转换为字符串,但是System.Drawing.Color不能通过ColorConverter转换为System.Drawing.Color。因此,它与值类型或引用类型无关。

其他问题:如果MyTypeConverter CanConvertFrom(typeof(X))和MyTypeConverter CanConvertTo(typeof(Y)), MyTypeConverter应该能够从类型X转换到类型Y吗?

用于与MyClass之间进行转换的TypeConverter是否能够转换MyClass ?

理解为什么存在类型转换器是非常重要的。它们是使Visual Studio中的各种设计器工作的glue。它们的主要作用是在特定类型的对象和字符串之间来回转换。在设计器中查看的字符串,可以对其进行编辑以更改对象。

框架有很多内置的TypeConverters。比如PointConverter和ColorConverter。它们的CanConvertFrom()方法只在sourceType参数为System.String时才说"go ahead"。以及一个匹配的ConvertFrom()方法,该方法只有解析字符串的代码。当一个点或颜色在PropertyGrid或内置属性窗口中显示时,所要做的就是

你当然可以让一个自定义的TypeConverter做任何你想做的事情。除非您编写代码显式地使用TypeConverter,否则您将遇到实际的用例就不那么清楚了。

在您的代码片段中,false返回的诊断是您根本没有正确实现CanConvertFrom()。很难说,你省略了代码。它必须显式地识别typeof(int)。当然,还需要在ConvertFrom()方法中使用所需的代码将int转换为bool