Domanda

Ho un'applicazione WPF che incorpora IronPython da usare come linguaggio di scripting. Ho un modello a oggetti che gli script IronPython possono usare per fare "cose".

Tuttavia ho riscontrato uno strano problema che ho risolto in un modo che non credo sia corretto.

Nel mio script voglio digitare quanto segue per impostare la posizione di un oggetto in WPF.

map.CanvasLocation = 10,10

Questo presenta un'eccezione che dice che non può convertire da PythonTuple a System.Windows.Point.

Al momento ho risolto l'uso di un convertitore di tipi personalizzato nel mio oggetto c #, ma non sono sicuro che questo sia il modo migliore per farlo.

Esiste un modo per dire a IronPython o .Net in generale come convertire da un tipo a un altro che può essere esteso in fase di esecuzione?

È stato utile?

Soluzione

Il modo in cui lo faccio è usare TypeDescriptor per aggiungere un attributo del convertitore di tipo a PythonTuple in fase di esecuzione.

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

Quindi utilizzo il codice seguente per trovare il convertitore nel setter attributi (metodo 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));
}

Altri suggerimenti

Perché non fare un

map.CanvasLocation = Point(10,10)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top