Pregunta

Tengo una aplicación WPF que incorpora IronPython para usarla como lenguaje de script. Tengo un modelo de objetos que los scripts de IronPython pueden usar para hacer 'cosas'.

Sin embargo, me he encontrado con un problema extraño que he resuelto de una manera que no creo que sea correcta.

En mi script quiero escribir lo siguiente para establecer la ubicación de un objeto en WPF.

map.CanvasLocation = 10,10

Esto aparece con una excepción que dice que no se puede convertir de PythonTuple a System.Windows.Point.

Actualmente he resuelto eso usando un convertidor de tipo personalizado en mi objeto C #, pero no estoy seguro de si esta es la mejor manera de hacerlo.

¿Hay alguna manera de decirle a IronPython o .Net en general cómo convertir de un tipo a otro que se puede extender en tiempo de ejecución?

¿Fue útil?

Solución

La forma en que hago esto es usar TypeDescriptor para agregar un atributo convertidor de tipo a PythonTuple en tiempo de ejecución.

TypeDescriptor.AddAttributes(typeof(PythonTuple), 
    new TypeConverterAttribute(typeof(Converter)));

Luego uso el siguiente código para encontrar el convertidor en el setter de atributos (método SetMemberAfter)

var converter = TypeDescriptor.GetConverter(value);
if (converter.CanConvertTo(destinationType))
{
    var destinationValue = converter.ConvertTo(value, destinationType);
    return destinationValue;
}
else
{
    throw new InvalidOperationException("Cannot convert from {0} to {1}".UIFormat(
        value == null ? "null" : value.GetType().Name, destinationType.Name));
}

Otros consejos

¿Por qué no hacer un

?
map.CanvasLocation = Point(10,10)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top