2013-04-07 3 views
1

Я пытаюсь настроить код C# для автоматического создания фиктивных или резервных делегатов для методов, которые вызываются скриптом IronPython и которые явно не реализованы.Динамически создавать резервный делегат во время выполнения

Скажем, есть сценарий, который вызывает нестатический метод класса C# «MoveTo», который еще не реализован в соответствующем классе. Обычно, если он существует, он добавляется в область действия скрипта, создавая соответствующий экземпляр делегата, который присваивается области вызовом «SetVariable» с именем метода и экземпляра делегата. Это отлично подходит для тех методов, которые уже реализованы.

В случае метод еще не реализован вызов не кончится, но вместо того, чтобы быть перенаправлен на фиктивный метод, который изящно обрабатывает вызов и претендующей успешного выполнения (которое следует рассматривать некритический в моем конкретном случае).

Проблема: методы, вызываемые скриптом IronPython, имеют широкий диапазон подписей (на самом деле они могут иметь любую возможную подпись). Поэтому я хотел бы динамически создать резервный делегат, который получает одну и ту же подпись вызываемого метода и, следовательно, «ловит» каждый вызов еще не реализованных методов.

Ребята, вы знаете, как я могу достичь этой цели?

+0

Не могли бы вы уточнить свои вопросы и добавить образцы? Вы говорите, что вы называете «нестатические методы класса C#», добавляя их через имя/делегат через SetVariable. Означает ли это, что в вашем скрипте python они выглядят как глобальные/статические/не-членные функции вместо вызова участника на экземплярах объектов CLR (при этом все еще неявно связаны с объектом CLR без объекта)? Ни один из методов ничего не возвращает? –

+0

Итак, в основном вы хотите создать метод со специальной сигнатурой во время выполнения? Вы смотрели на SO для динамического создания лямбда-выражений? – JJ15k

+0

@SimonOpelt: это правильно. В IronPython они выглядят как глобальные функции. Объект, к которому они принадлежат, - это одноэлементный, во всем приложении есть только один экземпляр этого класса. Объект представляет собой часть оборудования, а робот должен быть более точным. IronPython используется для написания поведения робота. Обнаруженные методы контролируют различные способности робота, такие как вождение, поворот, перемещение рук, подобные вещи. –

ответ

0

Вы должны быть в состоянии создать кетчуп всего метод, который принимает любое число/типа арга:

object Fallback([ParamDictionary]IDictionary<object, object> kwargs, params object[] args) { 
    return null; // or whatever 
} 

(К сожалению, это в обратном направлении от нормального пути Python написания подобной функции: def foo(*args, **kwargs):.)

Если вы не используете ключевые слова арг, вы можете упасть, что и просто использовать params:

object Fallback(params object[] args) { 
    return null; // or whatever 
} 

Затем используйте .SetVariable("whatever", Fallback), чтобы сделать его резервным методом.

+0

Я могу создать его, создав подходящий код Python во время выполнения и выполнив его в соответствующей области. К сожалению, ваш метод не работал .SetVariable ожидает объект Delegate и странно выдает ошибку при задании группы методов. Создание делегата с помощью Delegate.CreateDelegate (...) не работает либо потому, что полученный делегат не подходит к вызываемой функции Python. Ну, во всяком случае, он работает так, как я делаю это сейчас. Это быстро, грязно, но я считаю это приемлемым. Спасибо, в любом случае! –

Смежные вопросы