假设我有一个具有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型?
答案 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 所需的代码。