如果要转换为MyClass和从MyClass转换的TypeConverter能够转换MyClass

时间:2014-07-18 10:19:28

标签: c# typeconverter

假设我有一个具有TypeConverter的MyClass

[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还是它的副本?

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

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

b似乎等于假。如果我想使用PointConverter将System.Drawing.Point转换为System.Drawing.Point,我会看到类似的行为。但显然字符串CanConvertTo是一个字符串,但System.Drawing.Color无法通过ColorConverter转换为System.Drawing.Color。所以它与值类型或引用类型无关。

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

1 个答案:

答案 0 :(得分:2)

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

框架有很多内置的TypeConverters。像PointConverter和ColorConverter一样。他们的CanConvertFrom()方法只说"继续"如果sourceType参数是System.String。还有一个匹配的ConvertFrom()方法,它只有解析字符串的代码。在PropertyGrid或内置属性窗口中显示Point或Color时,他们只有做的事情。

您当然可以使自定义TypeConverter执行您想要的任何操作。除非您编写代码以明确使用TypeConverter,否则您不会明白您会遇到实际的用例。

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