Встроенные скрипты 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

Почему бы не сделать

map.CanvasLocation = Point(10,10)
person Rohit    schedule 31.07.2009
comment
Я мог бы сделать. Это сработает, но также не очень удобно для пользователя. Я хочу сделать скрипты максимально простыми в использовании. - person Nick Randell; 31.07.2009