Question

J'ai une application WPF qui intègre IronPython à utiliser comme langage de script. J'ai un modèle d'objet que les scripts IronPython peuvent utiliser pour faire des "choses".

Cependant, j'ai rencontré un problème étrange que j'ai résolu d'une manière que je ne crois pas correcte.

Dans mon script, je souhaite saisir ce qui suit pour définir l'emplacement d'un objet dans WPF.

map.CanvasLocation = 10,10

Ceci est accompagné d'une exception indiquant qu'il ne peut pas convertir PythonTuple en System.Windows.Point.

J'ai actuellement résolu ce problème en utilisant un convertisseur de type personnalisé dans mon objet c #, mais je ne suis pas sûr que ce soit la meilleure façon de le faire.

Existe-t-il un moyen d'indiquer à IronPython ou .Net en général comment convertir un type en un autre pouvant être étendu au moment de l'exécution?

Était-ce utile?

La solution

Pour ce faire, utilisez TypeDescriptor pour ajouter un attribut de conversion de type à PythonTuple lors de l'exécution.

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

Ensuite, j'utilise le code suivant pour trouver le convertisseur dans le jeu d'attributs (méthode 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));
}

Autres conseils

Pourquoi ne pas faire un

map.CanvasLocation = Point(10,10)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top