Pergunta

Eu tenho um aplicativo WPF que incorpora IronPython para usar como uma linguagem de script. Eu tenho um modelo de objeto que os scripts IronPython pode usar para fazer 'coisas'.

No entanto, eu me deparei com um problema estranho que eu tenha resolvido de uma forma que eu não acredito que é correto.

No meu script eu quero digite o seguinte para definir a localização de um objeto em WPF.

map.CanvasLocation = 10,10

Este surge com uma exceção dizendo que não pode converter de PythonTuple para System.Windows.Point.

Eu tenho atualmente resolvido que o uso de um conversor de tipo personalizado em meu c # objeto, mas não tenho certeza se esta é a melhor maneira de fazê-lo.

Existe uma maneira de dizer IronPython ou .Net, em geral, como converter de um tipo para outro que pode ser estendido em tempo de execução?

Foi útil?

Solução

A forma como eu fazer isso é usar TypeDescriptor para adicionar um atributo do tipo de conversor para PythonTuple em tempo de execução.

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

Então eu uso o seguinte código para encontrar o conversor no atributo setter (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));
}

Outras dicas

Por que não fazer um

map.CanvasLocation = Point(10,10)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top