2010-06-18 29 views

回答

17

嗯,不知道我以前见过,但你可以使用TypeDescriptor在运行时添加的TypeConverterAttribute,所以给我的示例类:

public class MyType 
{ 
    public string Name; 
} 

public class MyTypeConverter : TypeConverter 
{ 
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
    { 
     if (sourceType == typeof(string)) 
      return true; 

     return base.CanConvertFrom(context, sourceType); 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) 
    { 
     if (value.GetType() == typeof(string)) 
      return new MyType() { Name = (string) value }; 

     return base.ConvertFrom(context, culture, value); 
    } 
} 

然后我可以有一个方法:

public void AssignTypeConverter<IType, IConverterType>() 
{ 
    TypeDescriptor.AddAttributes(typeof(IType), new TypeConverterAttribute(typeof(IConverterType))); 
} 

AssignTypeConverter<MyType, MyTypeConverter>(); 

希望有帮助。

+0

但是,这对于XAML **不起作用,因为XAML在运行时不考虑组件修改。我[使用'TypeConverter'找到了解决方法](https://whathecode.wordpress.com/2015/02/14/generic-typeconverter/),它将其实现重定向到使用TypeDescriptor加载的转换器。 – 2015-02-14 18:01:26

3

您仍然可以使用TypeConverterAttribute并使用它的接受完全限定名称的构造函数。请参阅MSDN

+0

难道这仍然不需要引用包含typeconverter的程序集? – Spike 2010-06-21 01:27:53

+0

不,包含typeconverter的程序集将在运行时通过Type.GetType(http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx)加载。 – Patko 2010-06-21 07:10:10

+0

@Spike,不,因为类型转换器类型可以通过名称而不是typeof(...)引用。 – yoyo 2014-01-03 02:14:59

相关问题