Вградени IronPython скриптове и типове конвертиране

Имам WPF приложение, което вгражда IronPython за използване като скриптов език. Имам обектен модел, който скриптовете на IronPython могат да използват, за да правят „неща“.

Въпреки това се натъкнах на странен проблем, който реших по начин, който не вярвам, че е правилен.

В моя скрипт искам да напиша следното, за да задам местоположението на обект в WPF.

map.CanvasLocation = 10,10

Това идва с изключение, което казва, че не може да конвертира от PythonTuple в System.Windows.Point.

В момента съм решил това с помощта на персонализиран конвертор на типове в моя c# обект, но не съм сигурен дали това е най-добрият начин да го направя.

Има ли начин да кажете на IronPython или .Net като цяло как да конвертират от един тип в друг, който може да бъде разширен по време на изпълнение?


person Nick Randell    schedule 31.07.2009    source източник


Отговори (2)


Начинът, по който правя това, е да използвам TypeDescriptor, за да добавя атрибут за конвертор на типове към PythonTuple по време на изпълнение.

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

След това използвам следния код, за да намеря конвертора в настройката на атрибута (метод 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));
}
person Nick Randell    schedule 31.07.2009

Защо не направите a

map.CanvasLocation = Point(10,10)
person Rohit    schedule 31.07.2009
comment
Мога да направя. Това ще работи, но също така не е много удобно за потребителя. Искам да направя скриптовете възможно най-лесни за използване. - person Nick Randell; 31.07.2009