Встроенные скрипты IronPython и конвертирование типов
-
06-07-2019 - |
Вопрос
У меня есть приложение WPF, которое встраивает IronPython для использования в качестве языка сценариев. У меня есть объектная модель, которую сценарии IronPython могут использовать для «вещей».
Однако я натолкнулся на странную проблему, которую решил не так, как мне кажется.
В моем сценарии я хочу напечатать следующее, чтобы установить местоположение объекта в WPF.
map.CanvasLocation = 10,10
Возникает исключение, говорящее о том, что он не может преобразовать PythonTuple в System.Windows.Point.
В настоящее время я решил, что с помощью пользовательского преобразователя типов в моем объекте c #, но я не уверен, что это лучший способ сделать это.
Есть ли способ рассказать IronPython или .Net в целом, как преобразовать один тип в другой, который можно расширить во время выполнения?
Решение
Я могу использовать 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));
}
Другие советы
Почему бы не сделать
map.CanvasLocation = Point(10,10)