2010-06-18 18 views

Respuesta

17

Hmm, no estoy seguro de que he visto esto antes, pero se puede añadir el TypeConverterAttribute en tiempo de ejecución utilizando un TypeDescriptor, por lo que dado mis clases de muestra:

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); 
    } 
} 

Podría entonces tener un método:

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

AssignTypeConverter<MyType, MyTypeConverter>(); 

Espero que ayude.

+0

Esto, sin embargo, ** no funciona para XAML **, ya que XAML no tiene en cuenta modificaciones de componentes en el tiempo de ejecución. [Encontré una forma de evitar esto] (https://whathecode.wordpress.com/2015/02/14/generic-typeconverter/) usando un 'TypeConverter' que redirige su implementación a un convertidor cargado usando' TypeDescriptor'. –

3

Todavía puede usar TypeConverterAttribute y usar su constructor que acepta un nombre completamente calificado. Ver MSDN.

+0

¿No sería necesario hacer referencia al conjunto que contiene el convertidor de tipos? – Spike

+0

No, el ensamblado que contiene typeconverter se cargará en tiempo de ejecución a través de Type.GetType (http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx). – Patko

+0

@Spike, no, porque el tipo de convertidor de tipo puede referenciarse por nombre en lugar de typeof (...). – yoyo

Cuestiones relacionadas